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