我想通过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。
答案 0 :(得分:1)
我发现必须向防火墙添加两条规则:
如果同时添加两者,则可行。 如果只添加其中一个,则不起作用。我假设添加应用程序的名称应该足够了。