7
我需要確定一臺發送了多播數據包的機器的IP,以便我可以通過單播對其進行響應。如何確定C#中多播數據包的源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());
}
我知道正確的源IP是在IP報頭,因爲我可以清楚地看到它在那裏當我在Wireshark的嗅探包。但是,不是打印出發送系統的IP(192.168.3.4),而是打印出我訂閱的組播組的IP(225.2.2.6)。有沒有辦法獲得源IP?
是的。是的。 我只需將它轉換爲IPEndPoint就可以了。謝謝。 – 2010-02-18 21:04:01
太棒了;我不確定的唯一原因是因爲我之前沒有使用過多播組 - 這是我需要了解的東西! – Bill 2010-02-18 22:58:45