2016-06-15 3 views
0

Я разрабатываю серверное приложение, к которому необходимо подключиться клиенты. Но я не хочу, чтобы мои пользователи, чтобы ввести IP-адрес ... Я хочу, чтобы клиент, чтобы обнаружить все серверы, работающие на порту 4800 (в моем случае)Отправка UDP Broadcast, необходимо принимать сообщения от всех клиентов

Вот мой код сервера:

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); 
    } 
} 

и вот мой клиент отправки UDP Broadcast:

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); 
    } 

} 

Все серверы бег Прием вещания, но мой клиент получает только 1 IP адрес. Может быть, первый ответ, который доходит до клиента?

Как я могу обнаружить, что все мои серверы прослушивают мой порт?

+1

UDP не гарантируется. Обычно вы выпускаете трансляцию, и все реагирует. Вы либо берете первый вариант, чтобы не ждать других, либо ждать определенного времени, а получить их, чтобы выбрать тот, который они хотели. – BugFinder

ответ

0

Ваш клиент звонит ReceiveFrom() только один раз, поэтому он получит только один ответ. Вам нужно позвонить в ReceiveFrom() в цикле и запустить цикл в течение нескольких секунд, чтобы дать нескольким серверам достаточно времени для ответа.

Смежные вопросы