当前位置: 首页 > news >正文

嵌入式学习第二十六天!(网络传输:TCP编程)

TCP通信:

    1. TCP发端:

        socket  ->  connect  ->  send  ->  recv  ->  close

    2. TCP收端:

        socket  ->  bind  ->  listen  ->  accept  -> recv  ->  send  ->  close

    3. TCP需要用到的函数:

        1. connect:

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

              功能:发送链接请求

              参数:

                  sockfd:套接字文件描述符

                  addr:目的地址存放空间首地址

                  addrlen:IP地址的大小

              返回值:

                   成功返回0
                   失败返回-1

        2. send:

ssize_t send(int sockfd, const void *buf, size_t len, int flags);

              功能:发送数据

              参数:

                  sockfd:文件描述符

                  buf:发送数据空间首地址

                  flags:属性默认为0

              返回值:

                  成功返回实际发送字节数
                  失败返回-1

        3. recv:

ssize_t recv(int sockfd, void *buf, size_t len, int flags);

                功能:接收数据

                参数:

                    sockfd:套接字文件描述符

                    buf:存放数据空间首地址

                    len:最大接收数据的长度

                    flags:属性,默认为0

                返回值:

                    成功返回实际接收字节数
                    失败返回-1 
                    如果对方退出,返回0 

        4. listen:

int listen(int sockfd, int backlog);

                功能:监听客户端发送的连接请求(该函数不会阻塞)

                参数:

                    sockfd:套接字文件描述符

                    backlog:允许等待的尚未被处理的三次握手请求的最大个数

                返回值:

                    成功返回0 
                    失败返回-1 

        5. accept:

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

                功能:处理等待连接队列中的第一个连接请求,该函数具有阻塞功能(如果没有人发送链接请求,会阻塞等待)

                参数:

                    socket:套接字文件描述符

                    address:存放IP地址的空间首地址

                    addrlen:存放IP地址大小空间首地址

                返回值:

                    成功返回一个新的文件描述符
                    失败返回-1

        4. TCP编程练习:

                1. 利用TCP实现跨主机的文件发送:

send.c

#include "head.h"int main(void)
{FILE *fd = NULL;int sockfd = 0;int ret = 0;struct sockaddr_in severaddr;ssize_t nsize = 0;size_t rret = 0;char filename[100] = {0};char tmpbuff[1024] = {0};sockfd = socket(AF_INET, SOCK_STREAM, 0);if(sockfd == -1){perror("fail to socket");return -1;}severaddr.sin_family = AF_INET;severaddr.sin_port = htons(50000);severaddr.sin_addr.s_addr = inet_addr("192.168.1.162");ret = connect(sockfd,(struct sockaddr *)&severaddr, sizeof(severaddr));if(ret == -1){perror("fail to connect");return -1;}scanf("%s", filename);fd = fopen(filename, "r");if(fd == NULL){perror("fail to fopen");return -1;}nsize = send(sockfd, filename, strlen(filename), 0);if(nsize == -1){perror("fail to send");return -1;}while(1){memset(tmpbuff, 0, sizeof(tmpbuff));rret = fread(tmpbuff, 1, sizeof(tmpbuff), fd);if(rret == 0){break;}usleep(1000);nsize = send(sockfd, tmpbuff, rret, 0);if(nsize == -1){perror("fail to send");return -1;}}fclose(fd);close(sockfd);return 0;}

recv.c

#include "head.h"int main(void)
{FILE *fd = NULL;int ret = 0;int sockfd = 0;int contfd = 0;ssize_t nsize = 0;char *ptmp = NULL;char tmpbuff[1024] = {0};struct sockaddr_in serveraddr;serveraddr.sin_family = AF_INET;serveraddr.sin_port = htons(50000);serveraddr.sin_addr.s_addr = INADDR_ANY;sockfd = socket(AF_INET, SOCK_STREAM, 0);if(sockfd == -1){perror("fail to socket");return -1;}ret = bind(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr));if(ret == -1){perror("fail to ret");return -1;}ret = listen(sockfd, 10);if(ret == -1){perror("fail to listen");return -1;}contfd = accept(sockfd, NULL, NULL);if(contfd == -1){perror("fail to accept");return -1;}nsize = recv(contfd, tmpbuff, sizeof(tmpbuff), 0);if(nsize == -1){perror("fail to recv");return -1;}fd = fopen(tmpbuff, "w");if(fd == NULL){perror("fail to fopen");return -1;}while(1){memset(tmpbuff, 0, sizeof(tmpbuff));nsize = recv(contfd, tmpbuff, sizeof(tmpbuff), 0);if(nsize <= 0){break;}fwrite(tmpbuff, 1, nsize, fd);}fclose(fd);close(contfd);close(sockfd);return 0;
}

相关文章:

嵌入式学习第二十六天!(网络传输:TCP编程)

TCP通信&#xff1a; 1. TCP发端&#xff1a; socket -> connect -> send -> recv -> close 2. TCP收端&#xff1a; socket -> bind -> listen -> accept -> recv -> send -> close 3. TCP需要用到的函数&#xff1a; 1. co…...

【LeetCode】升级打怪之路 Day 14:二叉树的遍历

今日题目&#xff1a; 144. 二叉树的前序遍历94. 二叉树的中序遍历145. 二叉树的后序遍历102. 二叉树的层序遍历107. 二叉树的层序遍历 II199. 二叉树的右视图637. 二叉树的层平均值429. N 叉树的层序遍历515. 在每个树行中找最大值116. 填充每个节点的下一个右侧节点指针117. …...

[Unity实战]使用NavMeshAgent做玩家移动

其实除了Character Controller, Rigidbody&#xff0c;我们还可以使用NavMeshAgent去做。这么做的好处是能避免玩家去莫名其妙的地方&#xff08;毕竟基于烘焙过的导航网格&#xff09;&#xff0c;一般常见于元宇宙应用和mmo。 根据Unity手册&#xff0c;NavMeshAgent 也有和…...

官网:随便搞个?那不如不搞,搞不好就给公司减分了。

官网建设确实需要认真对待&#xff0c;不能随便搞。一个粗制滥造的官网可能会给公司带来负面影响&#xff0c;降低品牌形象和用户体验。以下是一些官网建设的重要原则&#xff1a; 专业性&#xff1a;官网应该展示公司的专业性和专业知识。它应该以专业的设计、内容和功能来展示…...

Ansible 基础入门

2&#xff09;Ansible 介绍 Ansible 基本概念 Ansible 是一种自动化运维工具&#xff0c;基于 Paramiko 开发的&#xff0c;并且基于模块化工作&#xff0c;Ansible 是一种集成 IT 系统的配置管理、应用部署、执行特定任务的开源平台&#xff0c;它是基于 Python 语言&#xf…...

讨论:5万官网是建站界的劳斯莱斯了吧,到了软件开发领域呢?

如题&#xff0c;所以赛道选择很重要&#xff0c;当然难度系数也不一样。能花5万元做官网的&#xff0c;凤毛麟角&#xff0c;如果是做软件开发&#xff0c;5万元顶多算个起步价&#xff0c;老铁们&#xff0c;是这样吗&#xff1f;...

手写分布式配置中心(三)增加实时刷新功能(短轮询)

要实现配置自动实时刷新&#xff0c;需要改造之前的代码。代码在https://gitee.com/summer-cat001/config-center​​​​​​​ 服务端改造 服务端增加一个版本号version&#xff0c;新增配置的时候为1&#xff0c;每次更新配置就加1。 Overridepublic long insertConfigDO(…...

【RabbitMQ】WorkQueue

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;MQ ⛺️稳中求进&#xff0c;晒太阳 Work Queues Work queues任务模型&#xff0c;简单来说就是让多个消费者绑定到一个队列&#xff0c;共同消费队列中的消息 当消息处理比较耗时的时候&…...

国内免费好用 Chat GPT推荐

无论您是寻找技术洞见还是灵感激发&#xff0c;此网站是您的绝佳去处。探索着名作家的精彩观点和创意解决方案&#xff0c;它不仅是知识的源泉&#xff0c;更是思维的驱动力。在这里&#xff0c;您将发现无尽的学习资源和启发&#xff0c;助您不断前行这是一款基于OpenAi开发的…...

基于springboot实现在线考试系统项目【项目源码+论文说明】

基于springboot实现在线考试系统演示 摘要 时代在变化&#xff0c;科技技术以无法预测的速度在达到新的高度&#xff0c;并且被应用于社会生活的各个领域&#xff0c;随着生活的加快&#xff0c;也使很多潜在的点逐渐突显出来&#xff0c;社会对于人才的要总是非常迫切的&…...

golang中go build 后读取配置文件

golang打包后读取配置文件 在用go写代码的时候&#xff0c;为了好用经常使用go build 打包&#xff0c;如果我们用到了配置文件&#xff0c;就总是导致不能找到文件所在位置了出现bug&#xff0c;所以以下代码就解决了这个问题。 核心代码&#xff1a; file, err : exec.Look…...

为raspberrypi编译bpftrace调试工具

基于eBPF的嵌入式应用调试 笔者之前写过几篇有关于使用eBPF调试Linux内核和应用的博客&#xff0c;其中提到&#xff0c;在嵌入式设备上使用BCC或bpftrace是不可行的&#xff1b;主要原因在于嵌入式设备的资源有限&#xff0c;而这两个调试工具依赖python/clang/llvm等库&…...

分段线性化问题探析

目录 1 使用0-1变量将分段函数转换为线性约束 2 连续函数采用分段线性化示例 3 matlab程序测试 4 matlab测试结果说明 5 分段线性化应用 1 使用0-1变量将分段函数转换为线性约束 2 连续函数采用分段线性化示例 3 matlab程序测试 clc;clear all; gn10;tn1; x_pfsdpvar(1, t…...

从零学算法2917

2917.给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 nums 中的 K-or 是一个满足以下条件的非负整数&#xff1a; 只有在 nums 中&#xff0c;至少存在 k 个元素的第 i 位值为 1 &#xff0c;那么 K-or 中的第 i 位的值才是 1 。 返回 nums 的 K-or 值。 注意 &#xf…...

[HackMyVM] 靶场 Wave

kali:192.168.56.104 主机发现 arp-scan -l # arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:d2:e0:49, IPv4: 192.168.56.104 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.56.1 0a:00:27:00:00:05 (Un…...

云渲染平台都开始涨价了?2024年性价比高的云渲染平台推荐

最近部分云渲染平台开始涨价&#xff0c;不论是通过调整机器性能&#xff0c;还是直接提价&#xff0c;都会对成本产生影响。这对已经习惯了平台价格的用户来说&#xff0c;并不是一件好事。这里举一些例子&#xff1a; 比如平台A&#xff0c;原“首小时渲染0.66元模式”已经下…...

搜索-BFS Meteor Shower S(流星雨)

Meteor Shower S&#xff08;流星雨&#xff09; 题目连接 题目描述 贝茜听说一场特别的流星雨即将到来&#xff1a;这些流星会撞向地球&#xff0c;并摧毁它们所撞击的任何东西。她为自己的安全感到焦虑&#xff0c;发誓要找到一个安全的地方&#xff08;一个永远不会被流星…...

RabbitMQ实战:Springboot集成RabbitMQ并验证五种消息模型

这目录 一、添加依赖二、配置文件中添加RabbitMQ访问配置三、消息生产者代码四、消息消费者代码五、验证参考资料 一、添加依赖 <!--AMQP依赖&#xff0c;包含RabbitMQ--><dependency><groupId>org.springframework.boot</groupId><artifactId>s…...

配置与管理防火墙

配置与管理防火墙 1&#xff0c;概念&#xff1a;设置在不同网络或网络安全域之间的一系列部件的组合。 2&#xff0c;功能&#xff1a;保护内网中易手攻击的服务&#xff1b;控制内外网之间网络系统的访问&#xff1b;隐藏内网的IP地址及结构的细节&#xff0c;提高网络保护…...

【SpringBoot】-- 实现本地文件/图片上传到服务器生成url地址

在java项目中你可能会有以下需求&#xff1a;用户上传本地图片&#xff0c;然后展示在网页上。本篇文章将使用阿里云oss实现上传图片到oss&#xff0c;oss生成url。 一、准备工作 首先进入阿里云&#xff0c;按如下操作 进入创建页面&#xff0c;修改读写权限为公共读 然后进…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释

以Module Federation 插件详为例&#xff0c;Webpack.config.js它可能的配置和含义如下&#xff1a; 前言 Module Federation 的Webpack.config.js核心配置包括&#xff1a; name filename&#xff08;定义应用标识&#xff09; remotes&#xff08;引用远程模块&#xff0…...