【问题标题】:C#: UDP client not working from one machine to otherC#:UDP 客户端不能从一台机器工作到另一台机器
【发布时间】:2014-09-21 04:54:44
【问题描述】:

我想通过 UDP 从一台机器到另一台交换信息。但是,由于某种原因,它不起作用。

此代码在机器 1 上运行,接收方 (192.168.200.1):

class Program
{
    static void Main(string[] args)
    {            
        StartListening();
        Console.Write("Waiting.... Press any key to stop");
        Console.ReadLine();
    }

    private async static void StartListening()
    {
        Console.WriteLine("Start listening...");
        string message = await ReadUdpPacket();
        Console.Write(message);
    }

    private async static Task<string> ReadUdpPacket()
    {
        UdpClient udpClient = new UdpClient(44444);            
        while (udpClient.Available == 0)
        {
            Thread.Sleep(10);
        }
        return "Something received...";
    }
}

这段代码在机器 2 (192.168.200.2) 上运行:

static void Main(string[] args)
    {
        Console.WriteLine("Small delay so that listeners can prepare...");
        Thread.Sleep(5000);
        Console.WriteLine("Sending packet...");
        IPEndPoint local = new IPEndPoint(IPAddress.Parse("192.168.200.2"), 0);
        IPEndPoint remote = new IPEndPoint(IPAddress.Parse("192.168.200.1"), 44444); // When changed to 192.168.200.2 and run receiver local, it works
        UdpClient udpClient = new UdpClient(local);
        byte[] bytes = Encoding.ASCII.GetBytes("abcdefghijklmnopqrstuvwxyz");
        udpClient.Send(bytes, bytes.Length, remote);
        Console.Write("Done, press any key...");
        Console.ReadKey();
    }

当我在两台机器上启动程序时,我希望在机器 1 的控制台窗口中看到“收到的内容”。但是,这并没有发生。 我通过 WireShark 看到 UDP 数据包离开机器 2。 机器 1 也可以看到该数据包;我也在那个上面运行 WireShark。但是机器 1 上的应用程序没有显示响应。

我也在同一台计算机(192.168.200.2,即机器 2)上运行这两个程序。程序1可以启动,但程序2需要稍作修改: 行:IPEndPoint remote = new IPEindpoint... 当然需要包含本地机器的IP地址;我通过程序 2 中的注释指出了这一点。因此该行显示为:

IPEndPoint remote = new IPEndPoint(IPAddress.Parse("192.168.200.2"), 44444);

当我这样做时,字符串'收到的东西'到达!

所以看起来编程是正确的(请注意我最小化了代码;这是重现我遇到的问题的最小项目)。否则我不会看到它在一台机器上同时使用这两个程序。 发件人应用程序可能也是正确的,因为 UDP 数据包从一台机器传输到另一台机器(至少,我在两台机器上运行的 WireShark 输出上看到了 UDP 数据包)。 但无论如何,接收方在另一台机器上运行时并没有收到数据包。

当您第一次运行接收器时,您很可能会收到防火墙警告。我点击了“允许”。

我还在另一台机器上尝试了这两个程序(更新地址后)。它也在这里工作。从一台机器到另一台机器都在同一台机器上工作:什么都没有。

我真的很纠结这个。有人对此有线索吗?我忘了什么吗?我在两台机器上都在 Win7 64 位上运行控制台应用程序。我使用 VS 2012。

【问题讨论】:

    标签: c# networking udp


    【解决方案1】:

    我发现必须在防火墙中添加两条规则:

    1. 为您的应用提供一个;所以你必须指定名称
    2. 一个用于端口和协议

    如果您同时添加两者,它会起作用。 如果只添加其中一个,则不起作用。我认为添加应用程序的名称就足够了。

    【讨论】:

    • 另外,删除轮询循环。
    • 是的,你是对的,但是上面的代码是为了演示这个问题。我工作的应用程序也不是控制台应用程序。我试图通过编写最小化的项目来证明这个问题。这并不总是最好的代码,我同意。
    猜你喜欢
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 2014-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多