嵌入式学习第二十六天!(网络传输: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通信: 1. TCP发端: socket -> connect -> send -> recv -> close 2. TCP收端: socket -> bind -> listen -> accept -> recv -> send -> close 3. TCP需要用到的函数: 1. co…...
【LeetCode】升级打怪之路 Day 14:二叉树的遍历
今日题目: 144. 二叉树的前序遍历94. 二叉树的中序遍历145. 二叉树的后序遍历102. 二叉树的层序遍历107. 二叉树的层序遍历 II199. 二叉树的右视图637. 二叉树的层平均值429. N 叉树的层序遍历515. 在每个树行中找最大值116. 填充每个节点的下一个右侧节点指针117. …...
[Unity实战]使用NavMeshAgent做玩家移动
其实除了Character Controller, Rigidbody,我们还可以使用NavMeshAgent去做。这么做的好处是能避免玩家去莫名其妙的地方(毕竟基于烘焙过的导航网格),一般常见于元宇宙应用和mmo。 根据Unity手册,NavMeshAgent 也有和…...
官网:随便搞个?那不如不搞,搞不好就给公司减分了。
官网建设确实需要认真对待,不能随便搞。一个粗制滥造的官网可能会给公司带来负面影响,降低品牌形象和用户体验。以下是一些官网建设的重要原则: 专业性:官网应该展示公司的专业性和专业知识。它应该以专业的设计、内容和功能来展示…...
Ansible 基础入门
2)Ansible 介绍 Ansible 基本概念 Ansible 是一种自动化运维工具,基于 Paramiko 开发的,并且基于模块化工作,Ansible 是一种集成 IT 系统的配置管理、应用部署、执行特定任务的开源平台,它是基于 Python 语言…...
讨论:5万官网是建站界的劳斯莱斯了吧,到了软件开发领域呢?
如题,所以赛道选择很重要,当然难度系数也不一样。能花5万元做官网的,凤毛麟角,如果是做软件开发,5万元顶多算个起步价,老铁们,是这样吗?...
手写分布式配置中心(三)增加实时刷新功能(短轮询)
要实现配置自动实时刷新,需要改造之前的代码。代码在https://gitee.com/summer-cat001/config-center 服务端改造 服务端增加一个版本号version,新增配置的时候为1,每次更新配置就加1。 Overridepublic long insertConfigDO(…...
【RabbitMQ】WorkQueue
📝个人主页:五敷有你 🔥系列专栏:MQ ⛺️稳中求进,晒太阳 Work Queues Work queues任务模型,简单来说就是让多个消费者绑定到一个队列,共同消费队列中的消息 当消息处理比较耗时的时候&…...
国内免费好用 Chat GPT推荐
无论您是寻找技术洞见还是灵感激发,此网站是您的绝佳去处。探索着名作家的精彩观点和创意解决方案,它不仅是知识的源泉,更是思维的驱动力。在这里,您将发现无尽的学习资源和启发,助您不断前行这是一款基于OpenAi开发的…...
基于springboot实现在线考试系统项目【项目源码+论文说明】
基于springboot实现在线考试系统演示 摘要 时代在变化,科技技术以无法预测的速度在达到新的高度,并且被应用于社会生活的各个领域,随着生活的加快,也使很多潜在的点逐渐突显出来,社会对于人才的要总是非常迫切的&…...
golang中go build 后读取配置文件
golang打包后读取配置文件 在用go写代码的时候,为了好用经常使用go build 打包,如果我们用到了配置文件,就总是导致不能找到文件所在位置了出现bug,所以以下代码就解决了这个问题。 核心代码: file, err : exec.Look…...
为raspberrypi编译bpftrace调试工具
基于eBPF的嵌入式应用调试 笔者之前写过几篇有关于使用eBPF调试Linux内核和应用的博客,其中提到,在嵌入式设备上使用BCC或bpftrace是不可行的;主要原因在于嵌入式设备的资源有限,而这两个调试工具依赖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 是一个满足以下条件的非负整数: 只有在 nums 中,至少存在 k 个元素的第 i 位值为 1 ,那么 K-or 中的第 i 位的值才是 1 。 返回 nums 的 K-or 值。 注意 …...
[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年性价比高的云渲染平台推荐
最近部分云渲染平台开始涨价,不论是通过调整机器性能,还是直接提价,都会对成本产生影响。这对已经习惯了平台价格的用户来说,并不是一件好事。这里举一些例子: 比如平台A,原“首小时渲染0.66元模式”已经下…...
搜索-BFS Meteor Shower S(流星雨)
Meteor Shower S(流星雨) 题目连接 题目描述 贝茜听说一场特别的流星雨即将到来:这些流星会撞向地球,并摧毁它们所撞击的任何东西。她为自己的安全感到焦虑,发誓要找到一个安全的地方(一个永远不会被流星…...
RabbitMQ实战:Springboot集成RabbitMQ并验证五种消息模型
这目录 一、添加依赖二、配置文件中添加RabbitMQ访问配置三、消息生产者代码四、消息消费者代码五、验证参考资料 一、添加依赖 <!--AMQP依赖,包含RabbitMQ--><dependency><groupId>org.springframework.boot</groupId><artifactId>s…...
配置与管理防火墙
配置与管理防火墙 1,概念:设置在不同网络或网络安全域之间的一系列部件的组合。 2,功能:保护内网中易手攻击的服务;控制内外网之间网络系统的访问;隐藏内网的IP地址及结构的细节,提高网络保护…...
【SpringBoot】-- 实现本地文件/图片上传到服务器生成url地址
在java项目中你可能会有以下需求:用户上传本地图片,然后展示在网页上。本篇文章将使用阿里云oss实现上传图片到oss,oss生成url。 一、准备工作 首先进入阿里云,按如下操作 进入创建页面,修改读写权限为公共读 然后进…...
CoPaw:让AI代码助手深度适配个人项目与团队规范的工程化实践
1. 项目概述与核心价值最近在折腾一个挺有意思的开源项目,叫CoPaw,作者是 alexgzx。光看名字可能有点摸不着头脑,但如果你对 AI 辅助编程、代码生成或者想提升自己的开发效率感兴趣,那这个项目绝对值得你花时间研究一下。简单来说…...
Real-ESRGAN-GUI 终极指南:免费AI图像增强工具如何让模糊照片重获高清新生
Real-ESRGAN-GUI 终极指南:免费AI图像增强工具如何让模糊照片重获高清新生 【免费下载链接】Real-ESRGAN-GUI Lovely Real-ESRGAN / Real-CUGAN GUI Wrapper 项目地址: https://gitcode.com/gh_mirrors/re/Real-ESRGAN-GUI 你是否曾为模糊的老照片感到无奈&a…...
高考解析几何“秒杀”技巧:用极点极线快速搞定椭圆定点定值难题
高考解析几何“秒杀”技巧:用极点极线快速搞定椭圆定点定值难题 解析几何作为高考数学的压轴题型,常常让考生望而生畏。面对复杂的计算和抽象的条件,如何在有限时间内快速找到突破口?极点极线理论作为高等几何中的重要工具&#x…...
Python自动化Excel数据抓取:OpenClaw技能实战指南
1. 项目概述:从Excel表格到智能数据抓取如果你每天的工作都离不开Excel,并且经常需要从各种网页、文档甚至PDF里手动复制粘贴数据,然后费劲地整理到表格里,那你一定对“Excel大师”这个称号既向往又头疼。我们总希望Excel能更“聪…...
Go语言AI编程助手SDK:提升Cursor代码理解与生成精准度
1. 项目概述:一个为AI编程而生的Go语言SDK如果你是一名Go语言开发者,同时又在深度使用Cursor这样的AI辅助编程工具,那么你很可能已经感受到了一个痛点:如何让AI更精准、更高效地理解你的代码库,并在此基础上进行智能操…...
药物发现自动化:FEP计算工作流引擎faah的设计原理与实战
1. 项目概述:一个面向药物发现的自动化工作流引擎 最近在药物研发的自动化工具领域,一个名为 kiron0/faah 的项目引起了我的注意。这并非一个简单的脚本集合,而是一个设计精巧、旨在为药物发现中的自由能微扰计算提供端到端自动化解决方案的…...
基于Nginx-Lua镜像构建高性能可编程网关的实践指南
1. 项目概述:一个为现代Web架构而生的Nginx镜像如果你和我一样,长期在容器化环境中部署和管理Web服务,那么你一定对Nginx的灵活性和Lua脚本的强大能力印象深刻。但将这两者结合,并打包成一个稳定、安全、功能齐全的Docker镜像&…...
智谱AI GLM-5V-Turbo:视觉生成代码的技术革命与实战架构
摘要:2026年5月,智谱AI联合清华大学发布了GLM-5V-Turbo多模态编程基座模型,在Design2Code基准测试中以94.8分的成绩超越Claude Opus的77.3分,实现了从"文本生成代码"到"视觉生成代码"的范式跃迁。本文深入解析该模型的核心技术架构——CogViT视觉编码器…...
轻量级Web框架Oli:从核心原理到生产实践
1. 项目概述:一个轻量级、可扩展的Web应用框架最近在梳理手头几个小项目的技术栈时,我又把amrit110/oli这个仓库翻了出来。这是一个在GitHub上由开发者amrit110创建并维护的名为oli的项目。乍一看标题,你可能会有点懵,oli是什么&a…...
基于Node.js的Markdown文档自动化转换工具:从原理到CI/CD集成实战
1. 项目概述:一个被低估的文档转换利器如果你和我一样,日常工作中需要处理大量不同格式的文档,比如把Markdown写的技术文档转成Word给产品经理看,或者把项目README转成PDF存档,那你肯定也经历过格式错乱、样式丢失的烦…...
