WAN上的UDP传输

时间:2011-08-13 14:58:36

标签: c# sockets network-programming udp wan

过去几天我问了几个类似的问题并得到了一些非常好的帮助。我现在明白我的问题好多了但我似乎遇到了麻烦。我编写了一个使用TCP和UDP连接的客户端服务器应用程序。 TCP连接在LAN和WAN上都能正常工作,但UDP连接通过WAN进行故障。根据我之前提出的问题,我意识到我的服务器需要在收到通信的EndPoint上回复客户端。我把一切都设置为这样工作。我会在问题后发布代码。我的问题是,当我从客户端连接使用EndPoint并且客户端首先建立连接时,我仍然无法建立UDP连接。它似乎在一个网络上工作,但后来在我尝试过的所有其他网络上失败了。任何有关解决这个问题的帮助表示赞赏。这是代码。

在服务器上接收UDP消息

private void receiveUDP()
    {
        System.Net.IPEndPoint test = new System.Net.IPEndPoint(System.Net.IPAddress.Any,UDP_PORT);
        System.Net.EndPoint serverIP = (System.Net.EndPoint)test;
        trans.Bind(serverIP);
        System.Net.IPEndPoint ipep = new System.Net.IPEndPoint(System.Net.IPAddress.Any, 0);
        System.Net.EndPoint Remote = (System.Net.EndPoint)ipep;

        while (true)
        {

            byte[] content = new byte[1024];

            int recv = trans.ReceiveFrom(content,ref Remote);

            int portNum = ((System.Net.IPEndPoint)Remote).Port;
            string message = Encoding.ASCII.GetString(content);
            string[] data = message.Split((char)124);
            //UpdateStatus(data[0] + data[1]);

            UserConnection sender = (UserConnection)clients[data[0]];
            if (sender.PortNumber != portNum)
                sender.PortNumber = portNum;
            if (sender.RemoteEnd != Remote)
            {
                sender.RemoteEnd = Remote;//Stores the EndPoint from the client connection
            }
            if (data.Length > 2)
            {
                OnLineRecieved(sender, data[1] + "|" + data[2]);
            }
            else
            {
                OnLineRecieved(sender, data[1]);
            }
        }
    }

客户端在此处收听

private void receiveUDP()
    {
        System.Net.IPEndPoint test = new System.Net.IPEndPoint(System.Net.IPAddress.Any,UDP_PORT_NUMBER);
        System.Net.EndPoint serverIP = (System.Net.EndPoint)test;
        server.Bind(serverIP);
        server.Ttl = 50;

        EndPoint RemoteServ = (EndPoint)servIP;
        while (true)
        {
            byte[] content = new byte[1024];
            int  data = server.ReceiveFrom(content, ref RemoteServ);

            string message = Encoding.ASCII.GetString(content);
            result = message;

            ProcessCommands(message);

        }
    }

编辑:服务器发送功能

public void SendData(string data)
    {
        if (RemoteEnd != null)//RemoteEnd is refreshed every time the client sends a UDP message
//Each Clients RemoteEnd is stored in a collection of Client objects in a server hashtable
        {
            //ipep = new IPEndPoint(ipAdd, PortNumber);
            byte[] dataArr = Encoding.ASCII.GetBytes(data);

            trans.SendTo(dataArr, dataArr.Length, SocketFlags.None, RemoteEnd);
        }
    }

2 个答案:

答案 0 :(得分:1)

可能有很多错误。请记住,UDP不提供传输调步,重传或确认。因此,如果您需要它们,必须提供它们。如果您让客户端先发送然后等待对每个查询的响应,那么您的第一个丢失的数据包将终止连接。

你也忘了描述问题。你说你没有建立连接,但这意味着什么?服务器是否收到客户端的第一个数据包?客户端是否收到服务器的第一个回复?

答案 1 :(得分:1)

您必须确定这是编程问题还是网络配置问题。

我要做的是运行服务器计算机上的客户端应用程序和客户端计算机上的服务器应用程序(并切换它们连接的主机)。

如果服务器应用程序不再从客户端应用程序接收UDP消息,则表明您遇到了网络配置问题。

如果服务器应用程序仍然可以从客户端应用程序接收消息,那么您就遇到了编程问题。