Сообщения TCP фрагментируются (разбиваются) в Win7, если размер данных превышает 1074 байта - PullRequest
1 голос
/ 23 августа 2011

Я использовал простой класс Socket из .NET Framework для отправки и получения сообщений данных через TCP. Когда я запускаю свое клиентское приложение tcp в Windows XP, сообщение с данными не фрагментируется (разбивается). Но когда я запускаю то же клиентское приложение tcp в Windows 7, сообщения данных фрагментируются (разделяются), когда размер сообщения данных превышает 1074 байта.

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 Ответ

3 голосов
/ 23 августа 2011

TCP-соединение представляет собой поток байтов, оно ничего не знает о границах ваших сообщений.

Любое одно чтение из TCP-соединения может (и будет) возвращаться между 1 байтом и размером предоставленного буфера. Это может измениться из-за состояния сети.

НЕТ взаимосвязи между объемом данных, записанных в TCP-соединение определенным вызовом Send (), и объемом данных, прочитанных из соединения путем вызова Recv (), за исключением того, что все записанные данные будет возвращен серией вызовов Recv.

Вы должны всегда выполнять цикл для получения данных и использовать собственное оформление сообщения для определения границ сообщения.

Я написал об этом здесь: http://www.codeproject.com/KB/IP/testingsocketservers.aspx в 2002 году.

...