socket網絡編程中read與recv區別


socket網絡編程中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函數調用

?
1
2
3
4
5
6
7
8
         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);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM