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