[英]How to do a UDP multicast across the local network in c#?
我試圖在我的本地網絡上進行一些簡單的UDP通信。
我想要做的就是對網絡上的所有機器進行多播
這是我的發送代碼
public void SendMessage(string message)
{
var data = Encoding.Default.GetBytes(message);
using (var udpClient = new UdpClient(AddressFamily.InterNetwork))
{
var address = IPAddress.Parse("224.100.0.1");
var ipEndPoint = new IPEndPoint(address, 8088);
udpClient.JoinMulticastGroup(address);
udpClient.Send(data, data.Length, ipEndPoint);
udpClient.Close();
}
}
這是我的接收代碼
public void Start()
{
udpClient = new UdpClient(8088);
udpClient.JoinMulticastGroup(IPAddress.Parse("224.100.0.1"), 50);
receiveThread = new Thread(Receive);
receiveThread.Start();
}
public void Receive()
{
while (true)
{
var ipEndPoint = new IPEndPoint(IPAddress.Any, 0);
var data = udpClient.Receive(ref ipEndPoint);
Message = Encoding.Default.GetString(data);
// Raise the AfterReceive event
if (AfterReceive != null)
{
AfterReceive(this, new EventArgs());
}
}
}
它在我的本地計算機上運行良好,但不能通過網絡運行。
- 似乎不是防火牆。 我在兩台機器上都禁用了它,但它仍然無效。
- 如果我直接發送到客戶端機器的硬編碼IP地址(即不是多播),它可以工作。
任何幫助,將不勝感激。
您的本地網絡硬件是否支持IGMP ?
您的交換機可能是多播感知的,但如果IGMP被禁用,它將不會注意到任何連接的硬件是否訂閱了特定的多播組,因此它不會轉發這些數據包。
要對此進行測試,請使用交叉電纜將兩台機器直接連接在一起。 應該(AFAICR)始終有效。
此外,它應該是服務器的一半,其中TTL參數提供給JoinMulticastGroup()
,而不是客戶端的一半。
我剛剛在類似的東西上花了4個小時(我想),我的解決方案是:
client.Client.Bind(new IPEndPoint(IPAddress.Any, SSDP_PORT));
client.JoinMulticastGroup(SSDP_IP,IP.ExternalIPAddresses.First());
client.MulticastLoopback = true;
使用組播組上的特定(第一個外部)IP地址。
我看不到代碼中任何地方指定的TTL 。 請記住,TTL原本是以單位秒為單位,但已成為單位跳躍。 這意味着通過使用聰明的TTL,您可以消除通過路由器。 我的機器上的默認TTL是32 - 我認為這應該是足夠的; 但是如果您的系統已經通過任何形式的安全鎖定,那么您的實際可能會有所不同(UdpClient.Ttl)。
我不能推薦你需要的TTL - 因為我個人需要做很多實驗。
如果這不起作用,您可以查看這些文章:
總而言之,看起來使用套接字而不是UdpClients取得了成功。
您選擇的多播組也可以是僅本地的。 嘗試另一個。
您的物理網絡層也可能導致問題。 我冒昧地質疑開關和直接(x-over)連接。 集線器和所有更智能的應該處理它們。 但是,我沒有任何文獻可以支持。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.