UDP穿孔仅部分工作c#
本文关键字:工作 仅部 穿孔 UDP | 更新日期: 2023-09-27 18:07:07
我正在尝试使用UDP穿孔voip应用程序。我目前有这个部分工作:
- 打开的端口未被服务器防火墙阻塞(端口转发)
- 在client1 上创建UDP套接字
- 在client2上创建UDP套接字
- 发送数据包到服务器应用程序
- 服务器发送client1, client2的ip地址和端口,反之亦然
- 客户端成功接收到其他客户端的ip地址和端口
现在我在最后阶段遇到了麻烦,这是我目前拥有的代码。我的问题是,虽然我们有彼此的ip地址和端口,我们不能连接到彼此p2p。有人有什么建议吗?
- ContactIP =从服务器返回的联系人的IP地址
-
ContactPort =从服务器返回的contactsPort
private void PunchHole() { try { int range = 10000; if ((contactPort - range) < 1000) { contactPort = (contactPort + (range * 2)); } //else if ((contactPort + range) >= 65535) { range = range / 2; } int port = (contactPort - range); byte[] bytesToSend = Encoding.UTF8.GetBytes("Stop"); #region Punch hole through different ports - for loop //Console.WriteLine(port); for (int i = (contactPort - range); i < 65534; i++) { if (punchingHole) { udpClient.Send(bytesToSend, bytesToSend.Length, contactIP.ToString(), port); port++; } else { break; } } if (port >= 65533 && punchingHole) { range = range * 2; port = contactPort - range; if (port < 1000) { port = contactPort - (range / 2); } for (int i = port; i < 65534; i++) { if (punchingHole) { udpClient.Send(bytesToSend, bytesToSend.Length, contactIP.ToString(), port); port++; if (port >= 65533 && (contactPort + 1000) > range) { port = contactPort - range; i = port; continue; } } else { break; } } } if (punchingHole) { Console.WriteLine("Hole punch unsucessful."); } #endregion } catch (SocketException sockEx) { if (sockEx.SocketErrorCode == SocketError.Interrupted) { } else { MessageBox.Show(sockEx.Message, "PunchHole()"); } } catch (Exception ex) { MessageBox.Show(ex.Message, "PunchHole()");} } private void ListeningPort() { Console.WriteLine("Started Listening"); IPEndPoint listenEP = new IPEndPoint(IPAddress.Any, localPort); byte[] messageBytes = udpClient.Receive(ref listenEP); punchingHole = false; voiceCallEP = new IPEndPoint(listenEP.Address, listenEP.Port); message = Encoding.UTF8.GetString(messageBytes); Console.WriteLine(message); Console.WriteLine(listenEP.Address.ToString().PadRight(30) + listenEP.Port); udpClient.Send(messageBytes, messageBytes.Length, voiceCallEP); this.Invoke(new MethodInvoker(delegate() { label1.Text = "Hole punched succesfully."; })); InitialiseCall(); }
- localPort是客户端认为它正在发送的端口(机器的私有端口)
编辑:我一直在修修补补,才走到这一步。它确实有效……但是我显然要通过所有端口,这是有效的,但这显然是一种糟糕的方式,特别是因为它断开了远程桌面应用程序,我用来测试VOIP应用程序在另一个网络的计算机上。
你不应该扫描所有的65535端口。如果您这样做,您可能会发现某些防火墙会阻止您。您的服务器应该告诉client1 client2的端点(公共IP和端口),反之亦然。
请随意使用我的例子:https://github.com/7wingfly/P2Pchat