2016-06-15 81 views
0

我正在开发客户端需要连接的服务器应用程序。 但我不希望我的用户输入的IP地址......我想客户发现的所有服务器上的端口4800上运行(对我来说)发送UDP广播,需要接收来自所有客户端的消息

这里是我的服务器代码:

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广播:

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(),然后运行循环几秒钟,以使多个服务器有足够的时间响应。

相关问题