2016-06-15 8 views
0

Ich entwickle eine Server-Anwendung, wo Clients eine Verbindung herstellen müssen. Aber ich will nicht meine Benutzer eine IP-Adresse eingeben ... Ich möchte der Kunde alle Server zu entdecken, auf Port 4800 (in meinem Fall) läuftSenden UDP Broadcast, müssen Nachrichten von allen Clients empfangen

Hier ist mein Server-Code:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 
    static ThreadStart ts = new ThreadStart(start_server); 
    Thread thread = new Thread(ts); 
    private void Form1_Load(object sender, EventArgs e) 
    { 


     thread.Start(); 
    } 

    private static void start_server() 
    { 
     //Start server 
     Socket server = new Socket(AddressFamily.InterNetwork, 
     SocketType.Dgram, ProtocolType.Udp); 
     Console.Write("Running server..." + Environment.NewLine); 
     server.Bind(new IPEndPoint(IPAddress.Any, 4800)); 

     while (true) 
     { 
      IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); 
      EndPoint tempRemoteEP = (EndPoint)sender; 
      byte[] buffer = new byte[1000]; 
      //Recive message from anyone. 
      server.ReceiveFrom(buffer, ref tempRemoteEP); 

      Console.Write("Server got '" + Encoding.ASCII.GetString(buffer).TrimEnd(new char[] { (char)0 }) + 
      "' from " + tempRemoteEP.ToString() + 
      Environment.NewLine); 
      string access_code = Encoding.ASCII.GetString(buffer).TrimEnd(new char[] { (char)0 }); 
      if (access_code == "7uz876t5r798qwe12") 
      { 
       Console.Write("Sending Response to " + tempRemoteEP.ToString() + 
       Environment.NewLine); 

       //Replay to client 

       server.SendTo(Encoding.ASCII.GetBytes("ACCESS GRANTED"), 
       tempRemoteEP); 
      } 
      else 
      { 
       Console.WriteLine("Client Access denied!"); 
       server.SendTo(Encoding.ASCII.GetBytes("ACCESS DENIED"), 
       tempRemoteEP); 
      } 

     } 
    } 

    private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     Environment.Exit(Environment.ExitCode); 
    } 
} 

und das ist mein Client einen UDP Broadcast-Senden:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 

    } 
    Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, 
     ProtocolType.Udp); 
    private void button1_Click(object sender, EventArgs e) 
    { 



     IPEndPoint AllEndPoint = new IPEndPoint(IPAddress.Broadcast, 4800); 

     //Allow sending broadcast messages 
     client.SetSocketOption(SocketOptionLevel.Socket, 
     SocketOptionName.Broadcast, 1); 

     //Send message to everyone 
     client.SendTo(Encoding.ASCII.GetBytes("7uz876t5r798qwe12"), AllEndPoint); 
     Console.Write("Client send '1' to " + AllEndPoint.ToString() + 
     Environment.NewLine); 

     IPEndPoint _sender = new IPEndPoint(IPAddress.Any, 0); 
     EndPoint tempRemoteEP = (EndPoint)_sender; 
     byte[] buffer = new byte[1000]; 

     string serverIp; 
     try 
     { 

      client.SetSocketOption(SocketOptionLevel.Socket, 
      SocketOptionName.ReceiveTimeout, 3000); 
      client.ReceiveFrom(buffer, ref tempRemoteEP); 
      Console.Write("Client got '" + buffer[0] + "' from " + 
      tempRemoteEP.ToString() + Environment.NewLine); 
      MessageBox.Show(Encoding.ASCII.GetString(buffer).TrimEnd(new char[] { (char)0 })); 
      //Get server IP (ugly) 
      serverIp = tempRemoteEP.ToString().Split(":".ToCharArray(), 2)[0]; 
      listServer.Items.Add(serverIp); 

     } 
     catch (Exception ex) 
     { 
      //Timout. No server answered. 
      MessageBox.Show(ex.Message); 
     } 

     // MessageBox.Show(serverIp); 
    } 

} 

alle laufenden Server sind Empfang der Sendung, aber mein Kunde erhält nur 1 IP-Adresse. Vielleicht die erste Antwort, die den Kunden erreicht?

Wie kann ich alle meine Server auf meinem Port erkennen?

+1

UDP ist nicht garantiert ankommen .. Normalerweise geben Sie eine Sendung und die Dinge reagieren .. Sie entweder die erste Option, so warten Sie nicht auf andere oder warten Sie auf eine bestimmte Zeit und bekommen sie zu wählen, welche sie wollten. – BugFinder

Antwort

0

Ihr Client ruft ReceiveFrom() nur einmal an, daher wird nur eine Antwort empfangen. Sie müssen stattdessen ReceiveFrom() in einer Schleife aufrufen und die Schleife mehrere Sekunden lang ausführen, um mehreren Servern genügend Zeit zum Antworten zu geben.