C # SocketException (0x80004005) при каждой двух попытках - PullRequest
0 голосов
/ 19 ноября 2018

Моя программа создает новый сокет TCP, отправляет запрос на сервер и читает ответ. Если запрашивается ответ, программа отправляет подтверждение, а если нет, то отправляет отрицательное подтверждение. Это отправить и получить часть работы, как и предполагалось.

Проблема в том, что когда я вызываю метод во второй раз, он выдает SocketException (0x80004005). Третья попытка работает точно так же, как и предполагалось, но каждые две попытки отправить запрос в сокет завершатся неудачей.

public void Send(byte[] request)
{
    var buffer = new byte[1024];
    var received = 0;
    try
    {
        using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
        {
            socket.Connect(Address, Port);
            socket.ReceiveTimeout = 5000;

            socket.Send(request);

            while ((received = socket.Receive(buffer)) > 0)
            {
                var response = buffer.Take(received);

                if (IsRequested(response))
                {
                    socket.Send(ACK);
                    var text = Encoding.UTF8.GetString(response);
                    Console.WriteLine(text);
                    return;
                }
            }
            socket.Send(NAK);
        }
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
    }
}

Я безуспешно пытался отключить, закрыть, утилизировать все возможные комбинации.

Я обнаружил, что если я сгенерирую исключение сразу после отправки подтверждения, метод будет работать каждый раз!

    if (IsRequested(response))
    {
        socket.Send(ACK);
        var text = Encoding.UTF8.GetString(response);
        Console.WriteLine(text);
        throw new Exception("Deliberate exception");
    }

Мой вопрос: Почему я получаю SocketException (0x80004005) каждые две попытки, если не выкидываю исключение?

...