socket中的读和写
一旦,建立好了TCP连接之后,我们就可以把得到的fd当作文件描述符来使用。由此网络程序里最基本的函数就是read和write函数了。
一、输入操作:read/ readv/ recv/ recvfrom/ recvmsg
1、read和recv函数
read原则:数据在不超过指定长度的时候有多少读多少,没有数据则会一直等待。所以一般情况下:我们读取都需要采用循环读的方式读取数据。
recv原则:recv中有一个MSG_WAITALL参数,正常情况下recv是会等到直到读取buff_size长度的数据,但也只是尽量读全,在有中断的情况下recv还是可能会被打断,造成没有读完指定的buff_size的长度。所以即使是采用recv+WAITALL参数还是要考虑是否需要循环读取的问题,在实验中对于MSG_WAITALL多数情况下recv(使用了MSG_WAITALL)还是可以读完buff_size.
read(sockfd, buff, buff_size); write(sockfd, buff, buff_size); recv(sockfd, buff, buff_size, MSG_WAITALL); //阻塞模式接收 send(sockfd, buff, buff_size, MSG_WAITALL); //阻塞模式发送 recv(sockfd, buff, buff_size, MSG_DONTWAIT); //非阻塞模式接收 send(sockfd, buff, buff_size, MSG_DONTWAIT); //非阻塞模式发送 recv(sockfd, buff, buff_size, 0); send(sockfd, buff, buff_size, 0);
1)尽量使用recv(, , MSG_WAITALL),read必须配合while使用,否则数据量大(240*384)时,数据读不完。
2)编程时写入的数据必须尽快读完,否则后面的数据将无法继续写入。
二、输出操作:write/ writev/ send/ sendto/ sendmsg
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!