Поток C # вышел из строя при использовании TCP send / receive - PullRequest
3 голосов
/ 18 апреля 2011

Я создавал небольшое клиент-серверное приложение, когда столкнулся с чем-то, что казалось смешанным в стриме 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 возилась с потоком (или, возможно, с пакетами). Я собираюсь удалить это программное обеспечение.

1 Ответ

1 голос
/ 18 апреля 2011

TCP гарантирует при доставке заказа. Я думаю, что-то не так с вашим приемным буфером. Может быть, вы подключаетесь дважды и используете один и тот же буфер?

Я пытался воспроизвести вашу проблему, но не могу. Я не уверен, на что ссылается clientSocketState, поэтому я использовал обычный байтовый массив для буфера. Вместо BeginAccept я лениво использовал Accept, но никаких других изменений не было.

Должно быть что-то еще, о чем вы нам не говорите: -)

Обновление : учитывая все, я начинаю верить, что некоторые брандмауэры или антивирусные программы портят вам жизнь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...