天天看點

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函數調用

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