我使用C來實現客戶端服務器應用程序。客戶端向服務器發送信息,服務器使用它發回信息。我目前正在編寫處理數據接收的代碼,以確保它實際上已經收到。C unix套接字編程讀取()問題
我遇到的問題表現出一些代碼後,最好的解釋:
int totalRead = 0;
char *pos = pBuffer;
while(totalRead < 6){
if(int byteCount = read(hSocket, pos, BUFFER_SIZE - (pos-pBuffer)>0)){
printf("Read %d bytes from client\n", byteCount);
pos += byteCount;
totalRead += byteCount;
}else return -1;
}
上面的代碼運行在服務器端,將打印出「閱讀從客戶1個字節的」 6倍,並計劃將繼續正常工作。我在這裏硬編碼6,知道我正在從客戶端寫入6個字節,但我會讓我的協議要求發送的第一個字節是緩衝區其餘部分的長度。
int byteCount = read(hSocket, pBuffer, BUFFER_SIZE);
printf("Read %d bytes from client", byteCount);
上面的代碼,取代第一代碼段的使用,將打印「閱讀客戶端,從6個字節」,並繼續工作正常,但如果只有5人讀它並不能保證我收到的每個字節例如。
任何人都可以向我解釋爲什麼會發生這種情況和一個可能的解決方案?我猜第一種方法確保所有字節正在交付,但它看起來效率低下一次讀取一個字節...
哦,這是發生在一個分叉子進程,我使用tcp/ip。
注意:我的目標是成功實現第一個代碼段,以便確保我正在讀取所有字節,但我無法正確執行。
您的協議還應該包含一些長度或內容分隔符,以便讓對方知道應該何時停止接收數據(類似於HTTP中的「Content-Length」或分塊編碼)。請參閱http://stackoverflow.com/a/6404085/372643 – Bruno 2012-01-17 15:08:17