Закройте сокет, а затем снова откройте его из того же порта в .net - PullRequest
8 голосов
/ 30 октября 2011

Хорошо, мне интересно, может ли кто-нибудь помочь с проблемой, с которой я сталкиваюсь ....

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

открытие:

    UdpServer = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
    UdpServerIpEndPoint = new IPEndPoint(IPAddress.Any, 9050);
    UdpEndPoint = (EndPoint)UdpServerIpEndPoint;
    UdpServer.Bind(UdpServerIpEndPoint);

закрытие:

        UdpServer.Shutdown(SocketShutdown.Both);
        UdpServer.Disconnect(true);
        UdpServer.Close();

После того, как я его закрою.и когда я пытаюсь восстановить соединение с тем же кодом, что и выше, я получаю сообщение об ошибке:

Дополнительная информация: обычно разрешено только одно использование каждого адреса сокета (протокол / сетевой адрес / порт)

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

Ответы [ 3 ]

13 голосов
/ 30 октября 2011

Я получил ответ .... Мне нужно использовать это после decleration сокета ...

socket.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.ReuseAddress, true);
0 голосов
/ 27 апреля 2015

Для справки, если кто-то еще наткнется на этот вопрос, но ищет реализацию UdpClient.

int port = 1234;
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
var endPoint = new IPEndPoint(IPAddress.Any, port);
socket.Bind(endPoint);

var updClient = new UdpClient();
updClient.Client = socket;
updClient.Connect(_ipAddress, port);
0 голосов
/ 30 октября 2011

Вы можете посмотреть на это 2 способами.

  1. На самом деле не получать, пока вы находитесь в состоянии остановки, просто в вашем BeginReceive, просто отбросьте / проигнорируйте данные

  2. Если вам действительно нужно воссоздать сокет, то не выполняйте отключение на вашем Сервере, потому что у вас фактически нет соединения. Ваше отключение выбрасывает

System.Net.Sockets.SocketException (0x80004005): A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) no address was supplied

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...