C # Получение адреса отправителя из UDP-сообщения - PullRequest
1 голос
/ 31 августа 2010

У меня есть встроенный интерфейс Ethernet (Lantronix XPort), который отвечает на широковещательную передачу 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 теперь содержит информацию об удаленной конечной точке!

Ответы [ 3 ]

8 голосов
/ 31 августа 2010

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

0 голосов
/ 22 октября 2013

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

0 голосов
/ 27 апреля 2011

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

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

попробуйте изменить 0 до 6530 4expl

система сгенерирует случайный номер порта

Есть идеи, почему это так?

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

НАЙДИТЕ: абстрактный класс, необходимый только для представления порта, не имеет значения

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...