我正在利用UDP打孔创建P2P应用程序。多亏了这个令人惊叹的论坛,我才得以实现-我可以在2台设备之间建立P2P连接!我的应用主要基于此帖子。我的主要目标是创建一种可靠的算法,以在2个设备之间建立P2P连接。
该应用程序当前能够建立连接-但在我看来,它是非常随机的,我需要它能够可靠地工作。有3种设备:
我的方法:
问题: 我尝试发送数据包至少10分钟,其频率从每秒10个数据包到每10秒一个数据包,其频率不同,我将重新启动设备和路由器,这些数据包再也无法通过了。
解决方案: 通常在从设备[A]发送几个数据包并停止后,再从设备[B]发送数据,然后建立连接。然后,两个设备将能够同时发送和接收数据包。这种方法不可靠,我不得不手动操作来回发送数据包,直到数据包开始通过为止。
两种设备具有相同的应用程序:
初始化UDP客户端:
private static UdpClient udpClient = new UdpClient();
public void SetUPUDP(IPEndPoint LocalEndPoint)
{
udpClient.ExclusiveAddressUse = false;
udpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
udpClient.Client.Bind(LocalEndPoint);
//https://stackoverflow.com/questions/7201862/an-existing-connection-was-forcibly-closed-by-the-remote-host
uint IOC_IN = 0x80000000;
uint IOC_VENDOR = 0x18000000;
uint SIO_UDP_CONNRESET = IOC_IN | IOC_VENDOR | 12;
udpClient.Client.IOControl((int)SIO_UDP_CONNRESET, new byte[] { Convert.ToByte(false) }, null);
}
Run Code Online (Sandbox Code Playgroud)
听力部分:
public static async Task<string> StartListening(IPEndPoint LocalEndPoint)
{
Console.WriteLine("Listening on " + LocalEndPoint + ".");
byte[] buffer = udpClient.Receive(ref LocalEndPoint);
Console.WriteLine("Bytes received from " + LocalEndPoint + " " + Encoding.ASCII.GetString(buffer) + ".");
messageReceived = true;
return Encoding.ASCII.GetString(buffer);
}
Run Code Online (Sandbox Code Playgroud)
发送部分
udpClient.Send(message, message.Length, RemoteEndPoint);
Run Code Online (Sandbox Code Playgroud)
问题
我不明白为什么在同时发送数据包时无法建立连接。我需要创建一个可靠的算法,在建立连接之前可以重复该算法。我不知道问题是否出在代码中,因为在建立连接后,应用程序可以同时发送和接收数据包。数据包的发送时间足够长,因此无论是停止发送还是等待发送下一个都应该没有什么区别。但是只有在我停止在[A]或[B]上发送数据包之后,这些数据包才会开始通过。
先感谢您!