2010-02-18 2 views
7

유니 캐스트를 통해 응답 할 수 있도록 멀티 캐스트 패킷을 보낸 컴퓨터의 IP를 결정해야합니다.C#에서 멀티 캐스트 패킷의 원본 IP를 어떻게 결정합니까?

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); 

그리고 : 나는 (코드 오류 검사와 관련없는 옵션을 제거하여, 간결하게 편집 한) 멀티 캐스트 연결을 통해 패킷을 수신하려면 다음 CSHARP (닷넷 3.5) 코드를 사용하고

여기에 내가 소스 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 헤더에있는 소스를 올바로 알고있다. 그러나 보내는 시스템의 IP (192.168.3.4)를 인쇄하는 대신 위의 코드는 내가 가입 한 멀티 캐스트 그룹의 IP를 출력합니다 (225.2.2.6). 소스 IP를 가져 오는 방법이 있습니까?

답변

3

LocalEndPoint 변수에 응답이 없습니다. 응답은 패킷 소스의 EndPoint 즉 다른 쪽 끝의 친구입니다. 아마도이 변수의 이름을 "remoteEP"와 같은 이름으로 바꾸고 혼동을 피하기 위해 특정 것이 아닌 것으로 초기화 할 것입니다.

+0

예. 예, 그렇습니다. IPEndPoint로 전달하기 위해 방금 캐스팅해야했습니다. 고맙습니다. –

+0

위대한; 내가 전에 멀티 캐스트 그룹과 함께 일하지 않았기 때문에 내가 확신 할 수없는 유일한 이유가있다. – Bill