2008-10-17 1 views
6

Как вид наблюдения для this question У меня есть решение, работающее на моей локальной машине, но не на машине в сети.Нужна помощь при обнаружении многоадресного udp-сервера в C#

Я не знаю слишком много о сокетах, кроме этих оснований, поэтому несите меня. Цель заключается в том, чтобы клиент мог искать сервер в локальной сети, и это результат некоторого кода cut/paste/edit.

Это код клиента:

IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 10294); 

    byte[] data = new byte[1024]; 
    public Form1() 
    { 
     InitializeComponent(); 

    } 

    private void button1_Click(object sender, EventArgs e) 
    { 

     Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
     client.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 10); 
     string welcome = "What's your IP?"; 
     data = Encoding.ASCII.GetBytes(welcome); 
     client.SendTo(data, data.Length, SocketFlags.None, ipep); 
     IPEndPoint server = new IPEndPoint(IPAddress.Any, 0); 
     EndPoint tmpRemote = (EndPoint)server; 
     data = new byte[1024]; 
     int recv = client.ReceiveFrom(data, ref tmpRemote); 
     this.IP.Text = ((IPEndPoint)tmpRemote).Address.ToString(); //set textbox 
     this.Port.Text = Encoding.ASCII.GetString(data, 0, recv); //set textbox 
     client.Close(); 
    } 

Это код сервера:

int recv; 
     byte[] data = new byte[1024]; 
     IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 10294); 
     Socket newsock = new Socket(AddressFamily.InterNetwork, 
       SocketType.Dgram, ProtocolType.Udp); 
     newsock.Bind(ipep); 
     newsock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Any,IPAddress.Parse("127.0.0.1"))); 

     while (true) 
     { 
      Console.WriteLine("Waiting for a client..."); 
      IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); 
      EndPoint tmpRemote = (EndPoint)(sender); 
      data = new byte[1024]; 
      recv = newsock.ReceiveFrom(data, ref tmpRemote); 
      Console.WriteLine("Message received from {0}:", tmpRemote.ToString()); 
      Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv)); 
      string welcome = "7010"; 
      data = Encoding.ASCII.GetBytes(welcome); 
      newsock.SendTo(data, data.Length, SocketFlags.None, tmpRemote); 
     } 

Он работает найти на моей локальной машине (клиент и сервер), но когда я пытаюсь другую машину в той же сети я получаю «существующее соединение было принудительно закрыто удаленным хостом»

Я понимаю, что мне нужно добавить много попыток/улов, но я просто пытаюсь получить представление о том, как это работает f рвые.

ответ

3

Я должен начать с того, что я ничего не знаю о C#, но ...

Глядя на определение ipep в коде клиента, это выглядит, как вы пытаетесь отправить данные на себя , а не передавать его (как было предложено в другом вопросе). То, что привлекло мое внимание, было то, что «127.0.0.1» - это адрес «localhost».

Это объясняет, почему это работает хорошо, когда вы работаете как с клиентом, так и с сервером на одной машине, так как он отправляет в.

Я ожидал бы, что правильная конечная точка будет для широковещательного адреса (например, «255.255.255.255») - хотя вы также можете выбрать широковещательный адрес локальной сети, в которой вы находитесь, в зависимости от того, насколько широко вы хотите транслировать.

+0

Да, оглядываясь на него после того, как вы упомянули, что имеет смысл, в то время (поскольку это в основном копируемый/вставленный код), я предположил, что это то, куда я отправляю, что, конечно, если я перестану думать об этом больше не имеет смысла указывать, откуда я отправляю. – Davy8 2008-10-19 04:34:39

-1
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 10294); 

должны стать:

IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("255.255.255.255"), 10294); 

И

newsock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Any, IPAddress.Parse("127.0.0.1"))); 

должен стать

newsock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Any, IPAddress.Parse("255.255.255.255"))); 

я думаю.

ОК, это не работает, поэтому что-то еще не так.

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