2013-03-18 18 views
1

在Linux中,Linux,使用Socket和讀寫功能,可以將數據分散嗎?

我正在編程使用客戶端 - 服務器結構的簡單聊天程序。它也包含文件傳輸功能。

我設計的格式用於客戶端向這樣的服務器傳輸文件數據。 (1個字節表示這是文件數據)(2個字節信息來區分發送者,接收者)(1個字節表示當前數據發送大小是多少)(DATA ............ ..)

上述信息將存儲在buf[]char[]

當然

,發件人使用寫入呼叫來發送文件數據,接收器使用讀呼叫接收文件數據。

我不知道上面的格式在讀取時可能會碎片化,使用使用套接字描述符的寫入函數。例如,發件人寫入sbuf[] = "abcdefgh"。接收器總是讀取rbuf[] = "abcdefgh"? 或rbuf[]可能是= "a""ab"或​​或"abcd"或....東西?

+8

假設tcp,是的,數據可以在讀取之間進行分段。在獲取所有數據之前,您可能必須在多次讀取之間進行讀取和緩衝。讀取的返回值將告訴您使用該調用讀取的字節數。 – Duck 2013-03-18 05:16:11

+3

Btw:對'write()'的調用也不一定寫出所指定的字節數量並且需要重複。始終檢查系統調用返回的值。 – alk 2013-03-18 07:23:04

+0

@Duck我可以得到參考的地方嗎?我查看了linux系統調用[linux manual](http://linux.die.net/man/2/read)中的'read','write'。但是,它沒有提到碎片,我找不到:(。謝謝你提前給予的幫助。 – podray 2013-03-19 11:52:36

回答

0

是的,它可以,也可能會。您應該考慮使用recv和send來代替讀取和寫入。 使用recv你可以設置選項MSG_WAITALL,這將使讀取塊直到可以返回全部數據量。 (對於SOCK_STREAM) 請看看男人recv /發送更多信息。

相關問題