C # UDP не может прослушивать порт, который уже использовался для отправки данных? - PullRequest
3 голосов
/ 03 ноября 2011

Я новичок в UDP / сетевом программировании и пытаюсь создать доску чата через UDP.

Моя конечная цель - выполнить пробивание UDP (что-то похожее на Skype), поэтому мне нужно прослушивать тот же порт, что и порт, используемый для отправки данных, иначе NAT отбросит входящий пакет.

Я пытался сделать

server.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);

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

Вот так выглядит мой код для слушателя (он находится в отдельном потоке) (он адаптирован из другого учебника в Интернете):

        byte[] data = new byte[1024];
        IPEndPoint ipep = new IPEndPoint(IPAddress.Any, (int)e.Argument);
        UdpClient newsock = new UdpClient();
        newsock.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
        newsock.Client.Bind(ipep);
        IPEndPoint from_ip = new IPEndPoint(IPAddress.Any, 0);
        Invoke(new Action(() => { WriteOnScreen("Done!"); }));
        while (true)
        {
            data = newsock.Receive(ref from_ip);
            string s = Encoding.ASCII.GetString(data, 0, data.Length);
            //more stuff to deal with s
        }

Это мой отправитель:

        UdpClient server = new UdpClient();
        server.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
        server.Connect(CurrIP, CurrPort);

Метод server.Close () будет вызываться только тогда, когда пользователь завершает работу приложения.

Когда я проверил локальный порт отправителя, я понял, что слушателю не удается прослушать только тогда, когда локальный порт получателя "(int) e.Argument" равен локальному порту отправителя. Когда я настраиваю порт приема на другой порт, я могу получать пакеты.

Кроме того, я не могу создать больше экземпляров UdpClient, так как мой локальный порт для каждого UdpClient будет отличаться, и поэтому я не смогу сделать дырокол.

Я уже искал много мест, и ни у кого, похоже, нет этой проблемы ...

Я считаю, что есть более легкий путь ...

Ответы [ 2 ]

3 голосов
/ 03 ноября 2011

Вам необходимо использовать один и тот же UdpClient для отправки и получения.

1 голос
/ 04 ноября 2011

Я понял, что метод Send может принять IPEndPoint в качестве другого параметра.

Тогда мой слушатель все равно сможет прослушивать все входящие соединения.

...