广域网上的UDP传输
本文关键字:传输 UDP 广域网 | 更新日期: 2023-09-27 18:05:35
在过去的几天里,我问了几个类似的问题,并得到了一些非常好的帮助。我现在对我的问题有了更好的理解,但我似乎遇到了一个障碍。我写了一个客户端服务器应用程序,使用TCP和UDP连接。TCP连接在LAN和WAN上都工作良好,但UDP连接在WAN上失败。基于我之前提出的问题,我意识到我的服务器需要在接收到通信的端点上回复客户机。我把一切都设置成那样。我将在问题后张贴代码。我的问题是,现在,当我使用端点从客户端连接和客户端首先建立连接,我仍然无法使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);
}
}
EDIT: SERVER'S send function
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);
}
}
可能有很多地方出错了。请记住,UDP不提供传输速度、重传或确认。所以如果你需要它们,你必须提供它们。如果您让客户端先发送,然后等待每个查询的响应,您的第一个丢失的数据包将终止连接。
你还忘了描述问题。你说你没有建立联系,但这是什么意思?服务器是否接收到客户端的第一个数据包?客户端是否接收到服务器的第一个应答?
您必须确定这是编程问题还是网络配置问题。
我要做的是在服务器机器上运行客户端应用程序,在客户端机器上运行服务器应用程序(并切换它们连接的主机)。
如果服务器应用程序不再从客户端应用程序接收UDP消息,那么你有一个网络配置问题。
如果服务器应用程序仍然可以接收来自客户端应用程序的消息,那么你的编程有问题。