我在具有NAT连接的VM上运行C中的UDP服务器,我从这里借用了这个示例:http://www.binarytides.com/programming-udp-sockets-c-linux/

UDP服务器绑定套接字并执行recvfrom以从客户端接收消息 . 然后它发送回复 . 这似乎工作正常 . 当我使用netcat或客户端也在示例中给出测试连接时,发送和接收两者都有效 .

现在,我试图让UDP服务器与C#客户端通信 . 我有一个C#客户端,它使用UdpClient类的异步接收(BeginReceive / EndReceive) . 我还做了一个C#服务器只是为了测试,我可以在C#客户端和C#服务器之间进行通信,在同一本地网络中的另一台机器上运行C#服务器 .

C#客户端正在运行C服务器的Linux VM的Windows 7主机上运行 . 以前,我使用两个不同的套接字进行发送和接收,然后C#客户端能够与C服务器通信 . 现在,我正在尝试为两者使用单个套接字,现在我只能进行单向通信:C服务器可以从C#客户端接收消息,并且可能会发回消息,但C#客户端根本不会收到任何消息 .

C#客户端正在使用此代码:

IPEndPoint e = new IPEndPoint(ServerIP, 11000); // server endpoint
            UdpClient u = new UdpClient(11000);
            UdpState s = new UdpState();
            s.e = e;
            s.u = u;

            u.BeginReceive(new AsyncCallback(DataReceivedUdp), s);

UdpState在别处被定义为:

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

上述代码中的ServerIP是用户输入的IP地址,已转换为IPAddress类型 . 我已尝试在那里的IP地址进行硬编码(使用IPAddress.Parse(“192.x.x.x . ”))并尝试:

IPEndPoint e = new IPEndPoint(IPAddress.Any, 11000); // server endpoint

我有一个调试器消息作为函数DataReceived(ISyncResult ar)中的第一行,每当从UDP服务器收到消息时都应该触发它,并且它永远不会打印出来(或者在该函数中做任何其他事情) . 我确实知道BeginReceive已经启动了,因为我有一个调试器线告诉我 .

有什么想法吗?我一直在撞击这个人一段时间,如果有另一双眼睛看着它并告诉我是否遗漏了一些明显的东西,那将是很棒的 . 提前致谢 .