C#:UDP客户端无法从一台机器运行到另一台机器

时间:2014-04-02 15:30:36

标签: c# networking udp

我想通过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的控制台窗口中看到“收到的东西”。但是,这不会发生。 我看到UDP数据包通过WireShark离开机器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);

当我这样做时,字符串'Something received'到达!

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

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

我也尝试了另一台机器上的两个程序(更新地址后)。它也适用于此。从同一台机器到另一台机器,从一台机器到另一台机器:没有。

我真的很困惑。有人知道这个吗?我忘了什么吗?我在两台机器上运行Win7 64位控制台应用程序。我使用VS 2012。

1 个答案:

答案 0 :(得分:1)

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

  1. 一个适合您的申请;所以你必须指定名称
  2. 一个用于端口和协议
  3. 如果同时添加两者,则可行。 如果只添加其中一个,则不起作用。我假设添加应用程序的名称应该足够了。