UDP組播發送與接收
背景:服務端獲取未知客戶端IP
誤區:
服務端往組播地址發送消息,然后以接收組播的方式接收組播成員的回復無法接到。通過Wireshark抓包可以抓到來自目標客戶端的包。發現目標客戶端采用UDP單播方式發送 因而服務端接收不到此包。
解決方法:
目標客戶端接收到來自服務端的組播信息之后同樣以組播的方式回復信息。信息包含客戶端IP和其他校驗信息
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
namespace Client
{
class Program
{
static void Main(string[] args)
{
UdpClient client = new UdpClient();
client.JoinMulticastGroup(IPAddress.Parse("239.255.255.250"));
IPEndPoint multicast = new IPEndPoint(IPAddress.Parse("239.255.255.250"), 37020);
string mess = "<?xml version=\"1.0\" encoding=\"utf-8\"?><Probe><Uuid>0414E4C1-1B08-408F-9442-BC2B6834D29D</Uuid><Types>inquiry</Types></Probe>";
byte[] buf = Encoding.Default.GetBytes(mess);
Thread t = new Thread(new ThreadStart(RecvThread));
t.IsBackground = true;
t.Start();
while (true)
{
client.Send(buf, buf.Length, multicast);
Thread.Sleep(1000);
}
}
static void RecvThread()
{
UdpClient client = new UdpClient(37020);
client.JoinMulticastGroup(IPAddress.Parse("239.255.255.250"));
IPEndPoint multicast = new IPEndPoint(IPAddress.Parse("239.255.255.250"),0);
while (true)
{
byte[] buf = client.Receive(ref multicast);
string msg = Encoding.Default.GetString(buf);
Console.WriteLine(msg);
Console.WriteLine(multicast);
}
}
}
}