Моя программа создает новый сокет 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)
каждые две попытки, если не выкидываю исключение?