C# SocketException (0x80004005) on every two attempt

0

My program creates a new TCP Socket, sends a request to a server and reads the response. If the response is requested, the program sends an acknowledge and if not it sends a negative acknowledge. This send and receive part work as intended.

The problem is that when i call the method a second time it throws SocketException (0x80004005). The third attempt works just as intended but every two attempt to send request to socket will fail.

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);
    }
}

I have tried disconnecting, closing, disposing and every possible combination of the three without success.

I discovered that if I throw an exception right after sending the acknowledge, the method will work every time!

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

My question: Why do I get SocketException (0x80004005) every two attempt if I don't throw an exception?

c#
sockets
socketexception
asked on Stack Overflow Nov 19, 2018 by user5825579

0 Answers

Nobody has answered this question yet.


User contributions licensed under CC BY-SA 3.0