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