Как снова использовать сокет в.NET?

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

Что я делаю неправильно?

14
задан Gabriel 8 January 2015 в 10:18
поделиться

2 ответа

Прочитав документацию MSDN для Socket.Disconnect , я заметил кое-что, что могло вызвать вашу проблему.

Если вам нужно вызвать Disconnect без предварительного вызова Shutdown, вы можете установить SocketOption с именем DontLinger на false и указать ненулевой интервал тайм-аута, чтобы убедитесь, что данные, поставленные в очередь для исходящей передачи, отправлены. Disconnect, затем блокируется до тех пор, пока данные не будут отправлены или пока не истечет указанный тайм-аут. Если вы установите для DontLinger значение false и зададите нулевой интервал тайм-аута, Close освобождает соединение и автоматически отбрасывает исходящие данные из очереди.

Попробуйте установить параметр сокета DontLinger и укажите тайм-аут 0 или используйте Shutdown перед вызовом отключения.

4
ответ дан 1 December 2019 в 15:12
поделиться

Из 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 ожидает, пока все данные в буфере не будут отправлены или получены. Однако, если мы установим только параметры задержки, сокет отключится по истечении определенного интервала тайм-аута.

0
ответ дан 1 December 2019 в 15:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: