Как я определяю исходный IP многоадресного пакета в C#?

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

Я использую следующий до-диез (.Net 3.5) код для получения пакетов по многоадресному соединению (код был отредактирован для краткости с проверкой ошибок и несоответствующими удаленными опциями):

IPEndPoint LocalHostIPEnd = new IPEndPoint(IPAddress.Any, 8623);
Socket UDPSocket = new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp); 
UDPSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastLoopback, 1);

UDPSocket.Bind(LocalHostIPEnd);

//Join the multicast group
UDPSocket.SetSocketOption(
     SocketOptionLevel.IP,
     SocketOptionName.AddMembership,
     new MulticastOption(IPAddress.Parse("225.2.2.6")));

IPEndPoint LocalIPEndPoint = new IPEndPoint(IPAddress.Any ,Target_Port); 
EndPoint LocalEndPoint = (EndPoint)LocalIPEndPoint; 

// Create the state object. 
StateObject state = new StateObject();
state.buffer.Initialize();
state.workSocket = UDPSocket;
state.id = "state0";
//Set up my callback
UDPSocket.BeginReceiveMessageFrom(
    state.buffer, 
    0,
    StateObject.BufferSize, 
    0,
    ref LocalEndPoint, 
    new AsyncCallback(ReceiveCallback), 
    state);

И вот обратный вызов, где я пытаюсь получить исходный IP:

private void ReceiveCallback( IAsyncResult ar ) 
{
    IPEndPoint LocalIPEndPoint = new IPEndPoint(IPAddress.Any, Target_Port);
    EndPoint LocalEndPoint = (EndPoint)LocalIPEndPoint;

    // Read data from the remote device. 
    // The following code attempts to determine the IP of the sender,
    // but instead gets the IP of the multicast group.
    SocketFlags sFlags = new SocketFlags();
    IPPacketInformation ipInf = new IPPacketInformation();

    int bytesRead = client.EndReceiveMessageFrom(ar, ref sFlags,
        ref LocalEndPoint, out ipInf);

    log.Warn("Got address: " + ipInf.Address.ToString());
}

Я знаю, что корректный исходный IP находится в заголовке IP, так как я могу ясно видеть его там, когда я осуществляю сниффинг пакета в wireshark. Однако вместо того, чтобы распечатать IP передающей системы (192.168.3.4), вышеупомянутый код распечатывает IP группы многоадресной передачи, что я подписан на (225.2.2.6). Существует ли способ получить исходный IP вместо этого?

7
задан Jean-François Corbett 11 December 2012 в 11:23
поделиться

1 ответ

Разве ваш ответ не находится в переменной LocalEndPoint, которая является конечной точкой источника пакета, т.е. чувака на другом конце. Обратите внимание, что я бы, вероятно, переименовал эту переменную во что-то вроде "remoteEP", и инициализировал ее чем-то неспецифическим, чтобы избежать путаницы.

3
ответ дан 7 December 2019 в 16:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: