Я создавал небольшое клиент-серверное приложение, когда столкнулся с чем-то, что казалось смешанным в стриме TCP, поэтому я написал небольшое тестовое приложение
Сервер просто создает сокет TCP и отправляет инкрементный счетчик
IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, 7777);
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Bind(ipEndPoint);
socket.Listen(10);
Socket clientSocket = socket.Accept();
byte test = 0;
while (true)
{
if (clientSocket.Send(new byte[] { test }, 0, 1, SocketFlags.None) == 1)
{
test++;
}
}
Поскольку это поток TCP, я ожидаю, что поток на клиенте будет иметь значение от 0 до 255 и т. Д.
Используя на клиенте следующее:
IPEndPoint ipEndPoint = new IPEndPoint(System.Net.IPAddress.Parse("127.0.0.1"), 7777);
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(ipEndPoint);
byte[] buffer = new byte[20000];
byte last = 255;
while (true)
{
int bytesRead = socket.Receive(buffer);
for (int i = 0; i < bytesRead; i++)
{
if (buffer[i] != (byte)(last+1))
{
//problem here
}
last = buffer[i];
}
}
Условие if никогда не должно возвращать true, но оно возвращается. После того, как я проанализировал поток на клиенте, он показал, что довольно часто в буфере содержатся последовательности типа 000 001 002 003 004 005 006 102 103 104 105.
Что мне здесь не хватает? Я всегда думал, что TCP обеспечит доставку заказов на уровне TCP.
Обновление : Торарин указал на правильное решение. Зона Alarm возилась с потоком (или, возможно, с пакетами). Я собираюсь удалить это программное обеспечение.