Я пытаюсь снова соединиться с сокетом, от которого я разъединился, но он не позволит его по некоторым причинам даже при том, что я назвал метод Разъединения с аргументом "reuseSocket" набором к истинному.
_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_socket.Connect(ipAddress, port);
//...receive data
_socket.Disconnect(true); //reuseSocket = true
//...wait
_socket.Connect(ipAddress, port); //throws an InvalidOperationException:
После того как сокет был разъединен, можно только снова соединиться снова асинхронно, и только к другому EndPoint. BeginConnect нужно назвать на потоке, который не выйдет, пока операция не была завершена.
Что я делаю неправильно?
Прочитав документацию MSDN для Socket.Disconnect , я заметил кое-что, что могло вызвать вашу проблему.
Если вам нужно вызвать Disconnect без предварительного вызова Shutdown, вы можете установить SocketOption с именем DontLinger на
false
и указать ненулевой интервал тайм-аута, чтобы убедитесь, что данные, поставленные в очередь для исходящей передачи, отправлены. Disconnect, затем блокируется до тех пор, пока данные не будут отправлены или пока не истечет указанный тайм-аут. Если вы установите для DontLinger значение false и зададите нулевой интервал тайм-аута, Close освобождает соединение и автоматически отбрасывает исходящие данные из очереди.
Попробуйте установить параметр сокета DontLinger
и укажите тайм-аут 0 или используйте Shutdown
перед вызовом отключения.
Из MSDN :
// Release the socket.
client.Shutdown(SocketShutdown.Both);
client.Disconnect(true);
if (client.Connected)
Console.WriteLine("We're still connnected");
else
Console.WriteLine("We're disconnected");
Если вы используете протокол, ориентированный на соединение, вы можете использовать этот метод для закрытия сокета. Этот метод завершает соединение и устанавливает для свойства Connected значение false. Однако, если reuseSocket истинно, вы можете повторно использовать сокет.
Чтобы гарантировать, что все данные будут отправлены и получены до закрытия сокета, вы должны вызвать Shutdown перед вызовом метода Disconnect.
Метод Socket.Shutdown
ожидает, пока все данные в буфере не будут отправлены или получены. Однако, если мы установим только параметры задержки, сокет отключится по истечении определенного интервала тайм-аута.