socket網絡編程中read與recv區別

一、read 與 recv 區別

read 原則編程

        數據在不超過指定的長度的時候有多少讀多少,沒有數據則會一直等待因此通常狀況下:咱們讀取數據都須要採用循環讀的方式讀取數據,由於一次read 完畢不能保證讀到咱們須要長度的數據,read 完一次須要判斷讀到的數據長度再決定是否還須要再次讀取。socket

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 進行循環讀要好一些。

函數

二、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);

三、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);

性能

相關文章
相關標籤/搜索