[英]read always read less octet than asked
對於家庭作業,我必須創建一個客戶端/服務器程序來存儲數據。 客戶端讀取文件並通過套接字將其發送到服務器,服務器接收它並存儲數據。 最終目標是在多個服務器之間實現分片。 該程序運行良好,但是當客戶端和服務器不在同一台機器上時,讀取函數讀取的數據總是比我要求的要少
這是我的閱讀代碼:
static inline size_t reliableRead(const int sourceSocket, void* data, const size_t nBytes)
{
size_t dataRead = 0;
unsigned int lossInARaw = 0;
do
{ const size_t readStatus = read(sourceSocket,data+dataRead,nBytes - dataRead);
if (readStatus == (unsigned)-1)
{
LOG_ERRNO_ERROR("error on read");
break;
}
dataRead += readStatus;
if (readStatus != nBytes)
LOG_WARNING("data loss(%u): read %zu/%zuo",++lossInARaw,dataRead,nBytes);
} while (dataRead < nBytes);
return dataRead;
}
這是我嘗試讀取 1024o 然后 8192o 塊時的結果。 首先客戶端和服務器是兩個不同的主機,然后在同一個
服務器端從另一台機器上的客戶端接收以 1024o 為單位切片的數據時
服務器端從另一台機器上的客戶端接收以 8192o 塊分割的數據時
從圖像上看,read 顯然能夠讀取 1024o 以上。 我以前從未進行過套接字編程,所以也許我遺漏了一些東西,我怎樣才能讓 read 函數經常讀取我要求它讀取的數據量? 因為即使沒有顯示警告,這顯然會增加發送時間(不要介意時間消息,它顯然是關閉的,我會努力解決的)
對於recv
,而不是read
,POSIX 指定了MSG_WAITALL
標志,您應該能夠使用它來防止不必要的上下文切換到您的線程,而它所做的只是重新請求剩余部分read
。
MSG_WAITALL 在 SOCK_STREAM 套接字上,這請求功能塊直到可以返回全部數據量。 如果套接字是基於消息的套接字,如果捕獲到信號,如果連接終止,如果指定了 MSG_PEEK,或者如果套接字有待處理的錯誤,該函數可能會返回較小的數據量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.