簡體   English   中英

在 .NET 中收發 UDP 數據包

[英]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 設置不同,它可能不會意識到它應該監聽這個本地子網廣播。

要嘗試的事情:

  1. 確保兩端都禁用 IPV6(IPV6 不支持廣播地址,但讓我們建立一個基線)。
  2. 在程序中顯式設置IP地址,可以嗎? 我的猜測是肯定的,所以我們必須確定原因。
  3. 加載wireshark並嗅探數據包。 看看他們是否一直到遠程主機,他只是忽略了他們。

在嘗試異步執行此操作時,Microsoft 忽略了告訴用戶像這樣創建自己的部分 class(見下文)。 非常簡單,但如果沒有這個,可能很難閱讀他們的示例。

private partial class UdpState
{
    public UdpClient u;
    public IPEndPoint e;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM