2017-01-12 191 views
1

我進入了UDP,並決定爲練習做一個小聊天。 我遇到了一個問題,我無法弄清楚自己。c#udp廣播包沒有收到

我創建了兩個C#控制檯程序這是完全一樣的(只是端口不同)

我發送一個UDP廣播包,然後希望得到它的第二個控制檯程序。發生什麼事是我發送廣播的節目接收它而另一節目則不收。反過來也是如此。

我已經關閉了防火牆 - >不會改變任何東西。

我發佈你的整個代碼,我希望你們可以幫助我,我真的很喜歡繼續前進!非常感謝!

class Program 
{ 
    const int PORT = 10101; 
    private static readonly UdpClient udpclient = new UdpClient(PORT); 
    static void Main(string[] args) 
    { 
     Console.ForegroundColor = ConsoleColor.Red; 
     udpclient.EnableBroadcast = true; 
     //bool for calling async receiver just once 
     bool receiving = false; 
     Console.WriteLine("Chat 2"); 
     //to keep while loop running --> change later 
     bool keepchatting = true; 
     #region keepchating loop 
     while (keepchatting) 
     { 
      if (!receiving) 
      { 
       startlistening(); 
      } 
      receiving = true; 
      newmessage(); 
     } 
    } 
    #endregion 

    //new message --> call sendmessage to broadcast text via UDP 
    public static void newmessage() 
    { 
     string msg; 
     msg = Console.ReadLine(); 
     byte[] message = Encoding.ASCII.GetBytes(msg); 
     sendmessage(message); 
    } 

    //Broadcast text via UDP 
    public static void sendmessage(byte[] tosend) 
    { 
     UdpClient client = new UdpClient(); 
     client.EnableBroadcast = true; 
     IPEndPoint ip = new IPEndPoint(IPAddress.Parse("255.255.255.255"), PORT); 
     client.Send(tosend, tosend.Length, ip); 
     client.Close(); 
     Console.WriteLine("Sent!"); 
    } 

    static IAsyncResult ar = null; 
    //Setup Async Receive Method 
    public static void startlistening() 
    { 
     ar = udpclient.BeginReceive(RecievedMessage, new object()); 
    } 

    //Message 
    public static void RecievedMessage(IAsyncResult ar) 
    { 
     IPEndPoint ip = new IPEndPoint(IPAddress.Any, PORT); 
     byte[] bytes = udpclient.EndReceive(ar, ref ip); 
     string msg = Encoding.ASCII.GetString(bytes); 
     Console.WriteLine("Received: " + msg); 
     startlistening(); 
    } 

} 
+0

嘗試使用多播IP 224-239進行廣播。 braodcast IP 255.255.255.255是爲某些協議保留的。我從來沒有能夠得到它的工作。 – jdweng

回答

0

我寫了一個應用程序,最近我在筆記本電腦上的兩個應用程序之間來回發送套接字消息。我使用127.0.0.1(本地主機的默認IP地址)作爲IP地址。你可以試試嗎?

+0

還是,不起作用,但無論如何謝謝你,我的代碼是好還是可能有一些錯誤? –

+0

一切看起來都很好,但當我說我是新手時,請相信我。我有一個工作的UDP客戶端,我爲另一個不包含client.Send()簽名中的IP地址的應用程序做了一個工作。另外,我從不關閉客戶端。我的理解是,沒有像TCP那樣與UDP握手。 – AClark

1

我已經改變了只有兩個部分的代碼,每個客戶端設置的其他客戶端的遠程端口號,試試這個:

在一個客戶端:

const int PORT = 10101; 
const int PORT_Remote = 10102; 

IPEndPoint ip = new IPEndPoint(IPAddress.Parse("255.255.255.255"), PORT_Remote); 

在其他客戶端:

const int PORT = 10102; 
const int PORT_Remote = 10101; 

IPEndPoint ip = new IPEndPoint(IPAddress.Parse("255.255.255.255"), PORT_Remote);