Получить IP-адрес отправителя UDP на принимающем порту, для которого было установлено значение IPAddress.any? - PullRequest
1 голос
/ 06 марта 2019

У меня есть приложение, в котором мне нужно получать одноадресные пакеты UDP с любого IP-адреса (на конкретном порту), но я хотел бы знать IP-адрес отправителя полученного пакета.Я создал сокет и связал его с помощью следующего кода:

Socket SocketLocal;
EndPoint epReceive;
int UCPort = 1000;
byte[] Buffer = new byte[1500];

SocketLocal = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

SocketLocal.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);

// Bind Socket
epReceive = new IPEndPoint(IPAddress.Any, UCPort );
SocketLocal.Bind(epReceive);

SocketLocal.BeginReceiveFrom(Buffer, 0, Buffer.Length, SocketFlags.None, ref epReceive, new AsyncCallback(RxCallBack), Buffer);

Обратный вызов выглядит следующим образом:

public void RxCallBack(IAsyncResult aResult)
{
    try
    {
        byte[] receivedData = new byte[1500];

        receivedData = (byte[])aResult.AsyncState;

        // I process/intepret the received data
        // ...

        // I have a list box where I simply want to display
        // the sender's IP address
        lstBox.Items.Add(SocketLocal.LocalEndPoint.ToString()));
        //  Here I simply get 0.0.0.0:<port number>
        // If I modify SocketLocal.LocalEndPoint.ToString above to SocketLocal.RemoteEndPoint.ToString it throws an exception

        Buffer = new byte[1500];
        SocketLocal.BeginReceiveFrom(Buffer, 0, Buffer.Length, SocketFlags.None, ref epReceive, new AsyncCallback(RxCallBack), Buffer);

    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }

}  // End of RxCallBack

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

Когда я пытаюсь извлечь IP-адрес отправителя, я просто получаю «0.0.0.0», что имеет смысл, учитывая, что я установил Socket на IPAddress.any

Должен быть способ найтиIP-адрес отправителя.Я искал и пробовал все различные варианты безрезультатно.Кто-нибудь может дать какое-нибудь руководство?

1 Ответ

1 голос
/ 07 марта 2019

После просмотра всех комментариев я смог найти ответ на свой вопрос.Был подобный вопрос, представленный здесь:

C # UDP Socket: Получить адрес получателя

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

В качестве продолжения ... Комментарий Гонсалеса побудил меня взглянуть на это по-другому, и поэтому я смог решить свою проблему с помощью следующего,Сначала я изменил последний параметр (состояние) метода «BeginReceiveFrom» на фактический сокет.Это влияет на элемент «IAsyncResult», который передается функции обратного вызова.Теперь моя первая часть программного обеспечения выглядит следующим образом:

// Just the BeginReceiveFrom was changed
SocketLocal.BeginReceiveFrom(Buffer, 0, Buffer.Length, SocketFlags.None, ref epReceive, new AsyncCallback(RxCallBack), SocketLocal);

Затем я изменил обратный вызов следующим образом:

public void RxCallBack(IAsyncResult aResult)
{
    try
    {
            // Create Local Buffer
            byte[] receivedData = new byte[1500];

            // Create Socket to get received data
            Socket ReceiveSocket = (Socket)aResult.AsyncState;

            // Create Endpoint
            EndPoint epReceive = new IPEndPoint(IPAddress.Any, 0);

            // Extract Data...
            int UDPRxDataLength = ReceiveSocket.EndReceiveFrom(aResult, ref epReceive);

            // Copy Rx Data to Local Buffer
            Array.Copy(SocketLocal.Buffer, receivedData, UDPRxDataLength);

            //Start listening for a new message.

            // Setup for next Packet to be received
            Buffer = new byte[1500];
            SocketLocal.BeginReceiveFrom(Buffer, 0, Buffer.Length, SocketFlags.None, ref epReceive, (RxCallBack), SocketLocal);

        // I process/intepret the received data
        // ...

        // The Sender's IP Address is located in the epReceive Endpoint
        lstBox.Items.Add( "Sender IP " + ((IPEndPoint)epReceive).Address.ToString() );

    }
    catch (Exception ex)
    {

        MessageBox.Show(ex.ToString());
    }


}  // End of RxCallBack

Выполнение вышеописанного отлично работает!

Спасибо всем за ваши комментарии!

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