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

posted @   Lin_泠沐  阅读(558)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示