socket網絡編程中read與recv區別


使用read接收文件,由於傳過來的文件大小錯誤,結果導致程序卡死在read處,之后改用recv接收。
recv使用MSG_DONTWAIT,在發現多次接收長度小於等於0時,中斷接收返回。
下面是摘抄的一段read和recv區別的介紹。

1、read 與 recv 區別

read 原則:

    數據在不超過指定的長度的時候有多少讀多少,沒有數據則會一直等待。所以一般情況下:我們讀取數據都需要采用循環讀的方式讀取數據,因為一次read 完畢不能保證讀到我們需要長度的數據,read 完一次需要判斷讀到的數據長度再決定是否還需要再次讀取。

recv 原則:
recv 中有一個MSG_WAITALL 的參數:
recv(sockfd, buff, buff_size, MSG_WAITALL),
正常情況下recv 是會等待直到讀取到buff_size 長度的數據,但是這里的WAITALL 也只是盡量讀全,在有中斷的情況下recv 還是可能會被打斷,造成沒有讀完指定的buff_size的長度。所以即使是采用recv + WAITALL 參數還是要考慮是否需要循環讀取的問題,在實驗中對於多數情況下recv (使用了MSG_WAITALL)還是可以讀完buff_size,
所以相應的性能會比直接read 進行循環讀要好一些。

2、read 與 recv函數調用

    read(sockfd, buff, buff_size);       
write(sockfd, buff, buff_size);
recv(sockfd, buff, buff_size,MSG_WAITALL); //阻塞模式接收
send(scokfd, buff, buff_size,MSG_WAITALL); //阻塞模式發送
recv(sockfd, buff, buff_size,MSG_DONTWAIT); //非阻塞模式接收
send(scokfd, buff, buff_size,MSG_DONTWAIT); //非阻塞模式發送
recv(sockfd, buff, buff_size,0);
send(scokfd, buff, buff_size,0);

3、socket編程經驗

    1)盡量使用recv(,,MSG_WAITALL),read必須配合while使用,否則數據量大(240*384)時數據讀不完
2)編程時寫入的數據必須盡快讀出,否則后面的數據將無法繼續寫入
3)最佳搭配如下:
nbytes = recv(sockfd, buff, buff_size,MSG_WAITALL);
nbytes = send(scokfd, buff, buff_size,MSG_WAITALL);

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com