【发布时间】: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