2016-06-15 6 views
0

クライアントが接続する必要があるサーバーアプリケーションを開発しています。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); 
    } 
} 

: しかし、私は私のユーザーは、IPアドレスを入力する必要はありません...私は、クライアントが

はここに私のサーバーのコードです(私の場合)ポート4800上で実行されているすべてのサーバーを検出したいです

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アドレスを受け取ります。そしてUDPブロードキャストを送信し、私のクライアントのthatsおそらくクライアントに到達する最初の応答ですか?

私のポートでリッスンしているすべてのサーバーをどのように発見できますか?

+1

UDPは保証されていません。通常はブロードキャストを発行し、物事は応答します。あなたは最初のオプションを取るので、他の人を待たずに、または指定された時間だけ待ってから、 – BugFinder

答えて

0

お客様のクライアントはReceiveFrom()を1回しか呼び出していないため、1つの応答のみを受信します。ループの代わりにReceiveFrom()に電話をかけ、数秒間ループを実行して、複数のサーバーに応答するのに十分な時間を与える必要があります。

関連する問題