2010-08-31 3 views
1

У меня есть встроенный интерфейс Ethernet (Lantronix XPort), который отвечает на широковещательную передачу UDP с его идентифицирующей информацией.C# Получение адреса отправителя из сообщения UDP

Я могу многоадресную рассылку «волшебного пакета», и датаграммы принимаются слушателем правильно, однако мне также нужно выяснить, какой IP-адрес отправляет эту дейтаграмму ответа. Если бы это был TCP, я бы сделал socket.RemoteEndPoint, но это вызывает исключение при применении к сокету UDP.

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     // magic packet 
     byte[] magicPacket = new byte[4] { 0, 0, 0, 0xf6 }; 

     // set up listener for response 
     Socket sendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 

     // EDIT: Also, had to add this to for it to broadcast correctly 
     sendSocket.EnableBroadcast = true; 
     IPEndPoint listen_ep = new IPEndPoint(IPAddress.Any, 0); 
     sendSocket.Bind(listen_ep); 

     // set up broadcast message 
     EndPoint send_ep = new IPEndPoint(IPAddress.Parse("192.168.255.255"), 30718); 
     sendSocket.SendTo(magicPacket, magicPacket.Length, SocketFlags.None, send_ep); 

     DateTime dtStart = DateTime.Now; 
     while (true) 
     { 
      if (sendSocket.Available > 0) 
      { 
       byte[] data = new byte[2048]; 
       // throws SocketException 
       //IPEndPoint ip = sendSocket.RemoteEndPoint as IPEndPoint; 
       sendSocket.Receive(data, SocketFlags.None); 
       if (data.Length > 4) 
       { 
        PrintDevice(data); 
       } 
      } 

      if (DateTime.Now > dtStart.AddSeconds(5)) 
      { 
       break; 
      } 

      Console.WriteLine("."); 

      Thread.Sleep(100); 
     } 

     // wait for keypress to quit 
     Console.WriteLine("Press any key to exit."); 
     Console.ReadKey(); 
    } 
} 

Любые мысли? Есть ли лучшая стратегия для чтения дейтаграмм ответов, которые позволили бы мне определить удаленный IP-адрес?

EDIT:

Как обычно, минута я отправляю на SO, момент ясности меня поражает.

Оказывается, я могу просто сделать это:

   EndPoint remote_ep = new IPEndPoint(IPAddress.Any, 0); 
       // Use ReceiveFrom instead of Receieve 
       //sendSocket.Receive(data, SocketFlags.None); 
       sendSocket.ReceiveFrom(data, ref remote_ep); 

И remote_ep теперь содержит информацию удаленной конечной точки!

ответ

8

Взгляните на ReceiveFrom вместо получения, это позволит вам передать ссылку на конечную точку.

+0

Я только что нашел его! Спасибо, я соглашусь ровно через 8 минут. :) – rrhartjr

+1

Ваши 8 минут. –

0

EndPoint remote_ep = новый IPEndPoint (IPAddress.Any, 0); // Использовать ReceiveFrom вместо sendSocket.Receive (данные, SocketFlags.None);
sendSocket.ReceiveFrom (данные, ref remote_ep);

я думаю, что это работает для IP, но он не для номера порта если вы заметите

попытка chaging 0 к чему-то еще, как 6530 4expl

это система будет генерировать это случайный номер порта

Любые идеи, почему это так?

P.S. Любые идеи, как я могу изменить свое имя пользователя здесь ....?

нашел это: абстрактный класс нужен только для представления порта это в стоимости не из

, поскольку нет привязки сделан, прежде чем руки этой операции рефа EndPoint, необходимого для представления отправителя. Это означает, что он должен показать порт отправителей и IP-адрес, чтобы не указывать, откуда получить сообщение. И экземпляр EndPoint на самом деле просто формальностью, похоже, что он перегружен системой с адресом отправителей в любом случае. Я думаю, что он должен делать что-то вроде того, как работает протокол UDP. Но в целом ref EndPoint показывает только, где u получил пакет, и только он не указывает, где u хочет, чтобы u'r commuicatino был от.

0

Что касается асинхронного сокета? Я не нашел способа получить удаленный IP-адрес. (Асинхронный метод ReceiveFromAsync - мой единственный вариант в wp8)

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