8

ユニキャスト経由で応答できるように、マルチキャスト パケットを送信したマシンの IP を特定する必要があります。

次のcsharp(.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());
}

Wireshark でパケットをスニッフィングすると、そこに明確に表示されるため、正しい送信元 IP が IP ヘッダーにあることがわかります。ただし、送信側システムの IP (192.168.3.4) を出力する代わりに、上記のコードは、私が加入しているマルチキャスト グループの IP (225.2.2.6) を出力します。代わりにソース IP を取得する方法はありますか?

4

1 に答える 1

3

あなたの答えは LocalEndPoint 変数ではないでしょうか。これは、パケットの送信元のエンドポイント、つまり相手側の人物です。混乱を避けるために、おそらくこの変数の名前を「remoteEP」のように変更し、特定されていないものに初期化することに注意してください。

于 2010-02-18T20:50:34.870 に答える