2011-02-25 183 views
1

我試圖使用數據下面的代碼從套接字讀取:讀取數據使用讀取功能

n = read(fd, buffer, 50000); 

的問題是:當從網絡服務器中的數據比TCP封裝尺寸較大,這些數據將被分成多個包。在這種情況下,read函數只是從fd讀取一個數據包,或者它會讀取fd中的所有包?

請注意,讀取函數只被調用一次。

+0

你用什麼語言編程? – 2011-02-25 15:24:21

+0

我的編程語言是C++ – cheng 2011-02-25 15:28:59

回答

4

由於您使用的是TCP,因此您的套接字類型爲SOCK_STREAM。 A SOCK_STREAM套接字是一個字節流,並且不維護數據包邊界,因此如果接收到多個數據包並且緩衝區中有足夠空間,對read()recv()的調用將讀取來自多個數據包的數據。如果緩衝區的大小不足以容納所有數據,它也可能從數據包的一部分返回數據。下一個read()將繼續讀取下一個字節。

0

功能read接收最大字節指定計數,在你的榜樣50000

當函數返回read,您需要檢查返回值。寫入緩衝區的實際字節數在變量n中。