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

关于linux编程——网络编程2

一、TCP客户端向服务器上传一个文件

tcp c/s 
客户端:
socket
connect

//通信
//1.发文件名 
//2.读文件内容,发给服务器 
//3.读到文件末尾 ---复制结束 
//  close
服务器:
socket 
bind
listen
accept
//通信
//1.读出文件名 
//2.创建同名文件 
//3.读数据写到文件中

tcp协议的特点:
1.面向连接 
2.可靠传输 
3.字节流 

二、粘包问题?

---tcp协议导致,网络的协议栈中导致

粘包 1.字节流特点 导致 发送时 ,多个消息,可能组合一起发送 接收时 ,多个消息,组合成一条交给应用层 2.处理 让消息与消息直接能区分开 --- 边界 a.结束标志 \r\n b.固定长度 100字节 c.设计一种消息结构体 //自定义的消息协议struct msg{//headint type; //-1 0 内容大小//bodychar buf[256]; //}msg_t msg;

三、recv、send函数

      ssize_t recv(int sockfd, void *buf, size_t len  , int flags);功能:从socket中接收信息 参数:@sockfd --- 要操作的socket@buf    --- 存放数据的空间 @len    --- buf的大小 @flags  --- 指定读取信息的操作标志MSG_DONTWAIT返回值:成功 读取到的字节数 失败 -1 && errno ssize_t read(    int fd, void *buf, size_t count );recv(sockfd,buf,sizeof(buf),0);<=>read(sockfd,buf,sizeof(buf),0);ssize_t send(int sockfd, const void *buf, size_t len  , int flags);功能:向socket中发送信息 参数:@sockfd --- 要操作的socket@buf    --- 存放数据的空间 @len    --- 发送的数据大小 @flags  --- 操作标志MSG_DONTWAIT返回值:成功 发送出去字节数 失败 -1 && errno ssize_t write(    int fd, const void *buf, size_t count);

四、sendto和receivefrom函数

 ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);ssize_t   send(int sockfd, const void *buf, size_t len, int flags);功能:向socket中发送信息 参数:@sockfd --- 要操作的socket@buf    --- 存放数据的空间 @len    --- 发送的数据大小 @flags  --- 操作标志MSG_DONTWAIT@dest_addr  --- 要发送到的目的地址 @addrlen    --- 地址大小返回值:成功 发送出去字节数 失败 -1 && errno ssize_t recv    (int sockfd, void *buf, size_t len, int flags);ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);功能:从socket中接收信息 参数:@sockfd --- 要操作的socket@buf    --- 存放数据的空间 @len    --- buf的大小 @flags  --- 指定读取信息的操作标志MSG_DONTWAIT@src_addr --- 保存 客户端的地址信息 @addrlen  --- 值结果参数 注意: 使用时,需要 初始化 addrlen = sizeof(struct sockaddr_in);返回值:成功 读取到的字节数 失败 -1 && errno 

五、udp 另外一种网络通信的模型 

  •  udp协议 :无连接 、不可靠 、  数据报
  • 决定: 应用场景:效率 实时性 
  编程:c/s udp客户端:socket //fgets(buf);sendto(clifd,buf)recvfromprintf();udp服务器:socketbind //固定的地址信息 recvfrom(cliaddr);printf();fgets();sendto

六、UDP的聊天室:

 server |---client1|---client2|---client3 //v1版本 
client1 ------ server
//上线          //服务器收到信息后,转发给其它在线的客户端 
//聊天          //服务器收到信息后,转发给其它在线的客户端
//下线          //服务器收到信息后,转发给其它在线的客户端//v2版本
client2 ------ server<-type+text-->//上线          //服务器收到信息后,转发给其它在线的客户端//问题: 1.知道其它客户端是否在线?//    1.1 记录和保存客户端的信息 (地址信息 + 状态)  // 处理逻辑://  保存客户端地址信息//  记录对应状态 ? //表//1.数组 //2.链表 //聊天          //服务器收到信息后,检测表中,在线客户端,转发给它 //下线          //服务器收到信息后,检测表中,在线客户端,转发给它//表中的数据, 状态 下线 broadcast_msg //广播 //v3版本 //v3版本 ---代码思路 
//经验:
//先写思路(注释),后写代码 
client2 ------ server<-type+text-->//上线          //服务器收到信息后,转发给其它在线的客户端//问题: 1.知道其它客户端是否在线?//    1.1 记录和保存客户端的信息 (地址信息 + 状态)  // 处理逻辑://  保存客户端地址信息//  记录对应状态 ? //表//1.数组 //2.链表 客户端                    			   
//上线       
step0:step1:step2:服务器:
step0:step1:step2://聊天          //服务器收到信息后,检测表中,在线客户端,转发给它 客户端聊天:do_send(?) 
{
while (1)
{msg.type = CHAT;fgets(msg.text)sendto();if(quit?){}   
}  
}
do_recv()
{while (1){msgrecvfrom(msg)msg.namemsg.text }
}  服务器如果是登录信息://记录到表中 //给表中在线的其它客户端转发一份 memcmp strcmp //下线          //服务器收到信息后,检测表中,在线客户端,转发给它//表中的数据, 状态 下线
http
-------------------------------------------------------------
服务器:api.k780.com 同时能处理多个客户端的请求 做出回应 //单客户端 
socket 
bind
listen
confd = accpet
while(1)
{readsprintfwrite
}//多客户端 
socket     //listenfd 
bind       //绑定服务器端的地址 
listen     //监听客户端的连接请求 --- 请求队列 
while(1)  //提取多个客户端的连接请求 建立连接 
{confd = accpet //请求队列中提取已连接的请求 返回连接好的socket的fd//通信while(1){readsprintfwrite}
}
http://www.xdnf.cn/news/1441981.html

相关文章:

  • 工业4.0时代的通信革命:OPC UA Pub/Sub机制全面解析
  • 百万级并发下的微服务架构设计之道:从阿里双11看分布式系统核心原则与落地实践
  • 云计算培训为什么这么贵?
  • EagleTrader观察|你的固定心态,可能正在悄悄让你交易破产
  • Element UI MessageBox 渲染虚拟节点的坑与解决方案
  • 【深度学习新浪潮】用3DGS做三维重建有哪些主要的技术路线可供选择?
  • 【随手记】vscode中C语言满足KR风格的方法
  • Leetcode—695. 岛屿的最大面积【中等】
  • Docker实战指南:从安装到架构解析
  • 【Linux】网络(中)
  • 数据结构:栈和队列(上)
  • 数据结构从青铜到王者第十九话---Map和Set(2)
  • 下载必要软件
  • Qt读写Excel--QXlsx基本使用
  • 基于-轻量级文档搜索系统的测试报告
  • 【GM3568JHF】FPGA+ARM异构开发板 使用指南:WIFI
  • SQLite3 操作指南:SQL 语句与 ORM 方法对比解析​
  • 存算一体:重构AI计算的革命性技术(1)
  • K8s Pod CrashLoopBackOff:从镜像构建到探针配置的排查过程
  • react-android-0.80.2-debug.aar下载很慢
  • GitHub 宕机自救指南技术文章大纲
  • Flutter Android真机器调式,虚拟机调试以及在Vscode中开发Flutter应用
  • 充电座结构设计点-经验总结
  • 10.2 工程学中的矩阵(2)
  • Android/Java 异常捕获
  • 电子病历空缺句的语言学特征描述与自动分类探析(以GPT-5为例)(中)
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘isort’问题
  • MCP模型库哪个好?2025年收录12万+服务的AI智能体工具集成平台推荐
  • AI创业公司:来牟科技-智能割草机器人
  • 如何高效记单词之:抓住首字母——以find、fund、fond、font为例