2014-06-06 48 views
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應用程序的遠程桌面應用程序不同的網絡。

+0

呃,你有什麼實際的問題/問題? –

+0

嗨,很抱歉,現在還不清楚。我的問題是,我們現在有對方的IP地址,但我們無法連接到彼此的P2P。 –

+2

您必須不斷髮送,直到您收到其他答案。一條消息是不夠的。 – jgauffin

回答

0

您不應該掃描所有65535個端口。如果你這樣做,你可能會發現有些防火牆會阻止你。你的服務器應該告訴client1 client2的端點(公共IP和端口),反之亦然。

隨意在這裏使用我的例子: https://github.com/7wingfly/P2Pchat