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 @ 2022-06-30 17:47  Lin_泠沐  阅读(541)  评论(0编辑  收藏  举报