我是UDP /网络编程的新手,我正在尝试通过UDP创建聊天板。
我的最终目标是进行UDP打孔(与Skype类似的概念),因此我需要在与用于发送数据的端口相同的端口上侦听,否则NAT将丢弃传入的数据包。 / p>
我尝试过做
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的本地端口会有所不同,所以我无法进行打孔。
我已经搜索了很多地方,似乎没有人有这个问题......
我相信有一种更简单的方法......
答案 0 :(得分:3)
您需要使用相同的UdpClient
进行发送和接收。
答案 1 :(得分:1)
我意识到Send
方法可以接受IPEndPoint
作为另一个参数。
然后我的听众仍然可以收听所有传入的连接。