За последние пару дней я задал пару похожих вопросов и получил действительно большую помощь.Теперь я немного лучше понимаю свою проблему, но, похоже, наткнулся на препятствие.Я написал клиент-серверное приложение, которое использует как TCP, так и UDP соединение.Соединение TCP отлично работает как в локальной сети, так и в глобальной сети, но соединение UDP не работает по глобальной сети.Основываясь на вопросах, которые я задавал ранее, я понял, что мой сервер должен ответить клиенту в конечной точке, с которой он получил сообщение.Я настроил все на работу таким образом.Я отправлю код после вопроса.Моя проблема заключается в том, что, хотя я использую 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);
}
}