[英]Sending and receiving UDP packets in .NET
我正在嘗試在 LAN 上測試 UDP 通信。 我有一小段代碼,我試圖在兩台計算機上運行它(一台應該等待接收,另一台應該發送)。 奇怪的是,計算機 A 發送而 B 正確接收,但是如果我嘗試 A 接收和 B 發送它就不起作用。 你知道為什么會這樣嗎?
public void SendBroadcast(int port, string message)
{
UdpClient client = new UdpClient();
byte[] packet = Encoding.ASCII.GetBytes(message);
try
{
client.Send(packet, packet.Length, IPAddress.Broadcast.ToString(), port);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
public void Receive(int port)
{
UdpClient client = null;
try
{
client = new UdpClient(port);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
IPEndPoint server = new IPEndPoint(IPAddress.Any, 0);
while (true)
{
try
{
byte[] packet = client.Receive(ref server);
Console.WriteLine("{0}, {1}", server, Encoding.ASCII.GetString(packet));
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
和電話:
SendBroadcast(444, "hello"); Receive(444);
如果我在同一台計算機上運行該程序的 2 個實例,它可以正常工作,但每次調用會創建 3 個包。
提前致謝。
嘗試使用異步方法,這樣您就可以繼續偵聽消息而不會阻止發送消息。
好吧,如果相同的代碼適用於一個而不是另一個,那就是你的環境。 檢查您的防火牆設置,確保它不會阻止發送方的廣播或阻止接收方的接收。 Wireshark(甚至是 Windows 的 netmon)在這里應該會有所幫助。
這兩個系統之間有什么網絡設備?
同一子網中的兩個系統是否具有相同的子網掩碼?
IPV4 網絡有一個有趣的地方。 你可以有多個廣播地址。 您可以廣播到本地網絡或本地子網。 這些是明顯不同的地址,如果一個系統的 IP 設置不同,它可能不會意識到它應該監聽這個本地子網廣播。
要嘗試的事情:
在嘗試異步執行此操作時,Microsoft 忽略了告訴用戶像這樣創建自己的部分 class(見下文)。 非常簡單,但如果沒有這個,可能很難閱讀他們的示例。
private partial class UdpState
{
public UdpClient u;
public IPEndPoint e;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.