2010-02-18 19 views
7

Bana bir multicast paket gönderen bir makinenin IP'sini belirlemem gerekiyor, böylece tek noktaya yayın yoluyla yanıtlayabiliyorum.C# içinde çok noktaya yayın paketinin kaynak IP'sini nasıl belirlerim?

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

Ve: Ben (kod hata kontrolü ve alakasız seçenekler kaldırıldı ile, kısalık için düzenlendi) bir çok noktaya bağlantı üzerinden paketlerini almak için aşağıdaki CSharp (.NET 3.5) kodu kullanıyorum

burada kaynak IP almaya çalışıyorum geri arama, var:

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

ben wireshark içinde paket koklayarak zaman açıkça orada görebilirsiniz beri IP, IP başlığında olduğu doğru kaynağını biliyorum. Ancak, gönderme sisteminin IP'sini (192.168.3.4) yazdırmak yerine, yukarıdaki kod abone olduğum multicast grubunun IP'sini (225.2.2.6) basar. Bunun yerine kaynak IP'yi almanın bir yolu var mı?

cevap

3

Yanıtınız, paketin kaynağının Uç Noktası olan LocalEndPoint değişkeninde değil, diğer ucundaki dostunuz değil. Bu değişkeni muhtemelen "remoteEP" gibi bir şey olarak yeniden adlandıracağımı ve karışıklığı önlemek için onu spesifik olmayan bir şeye atayabileceğimi unutmayın.

+0

Evet. Evet öyle. Sadece almak için bir IPEndPoint'e atadım. Teşekkür ederim. –

+0

Harika; Emin olmamamın tek nedeni daha önce Multicast gruplarıyla çalışmamış olmama sebep oldu - benim için bir şey öğrenmek! – Bill

İlgili konular