2011-08-23 25 views
1

我已經使用.NET框架中的簡單Socket類來通過TCP發送和接收數據消息。當我在Windows XP上運行我的tcp客戶端應用程序時,則數據消息不會被分段(分割)。但是,當我在Windows 7上運行相同的tcp客戶端應用程序時,數據消息大小超過1074字節時,數據消息被分段(分割)。如果datasize大於1074字節,TCP消息在Win7中被分片(拆分)

IPEndPoint ipEndPoint = new IPEndPoint("<server ip address>", 601); 
Socket tcpSocket = new Socket(ipEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); 
tcpSocket.Connect(ipEndPoint.Address, ipEndPoint.Port); 
tcpSocket .Send(data, data.Length, 0); 
tcpSocket.Close(); 

如果您有任何建議,請讓我知道。

+1

如果你發送更多的數據會發生什麼?發送像1M,看看它是否繼續分裂。 – cnicutar

+0

這是否發生在同一網絡上? – cnicutar

+0

不同的MTU設置? – Kimvais

回答

3

TCP連接是一個字節流,它不知道你的消息邊界。

從TCP連接讀取的任何單個數據都可以(並將)在1個字節和提供的緩衝區大小之間返回。這可能會由於網絡條件而改變。

通過對Send()的特定調用寫入TCP連接的數據量與通過調用Recv()從連接讀取的數據量之間沒有任何關係,除了所有數據書面將由一系列Recv電話返回。

您應該始終循環接收數據並使用自己的消息幀來確定消息邊界。

我寫了更多關於此這裏:http://www.codeproject.com/KB/IP/testingsocketservers.aspx回在2002年