0
我想爲voip應用使用UDP孔衝孔。我現在有這部分工作:UDP孔衝孔只有部分工作c#
- 沒有通過防火牆阻止在服務器上打開端口(端口轉發)
- 在CLIENT1上創建UDP套接字 在CLIENT2
- 創建UDP套接字
- 發送數據包到服務器應用程序
- 服務器發送客戶端1,客戶端2的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應用程序的遠程桌面應用程序不同的網絡。
呃,你有什麼實際的問題/問題? –
嗨,很抱歉,現在還不清楚。我的問題是,我們現在有對方的IP地址,但我們無法連接到彼此的P2P。 –
您必須不斷髮送,直到您收到其他答案。一條消息是不夠的。 – jgauffin