Server 如何使用专用ip向客户端发送数据包?
我用c#制作客户端和服务器,并希望在这两个应用程序之间发送数据包。当客户端向服务器发送消息时,一切正常,服务器接受它。但当服务器尝试回复时,客户端不会收到消息。我认为,这是一个问题,因为我有私有ip(我不确定,但我认为它是NAT-1IP和许多计算机),我的服务器运行在我的VPS上。 那么,如何从服务器回复客户机呢 客户端代码:Server 如何使用专用ip向客户端发送数据包?,server,udp,client,nat,packets,Server,Udp,Client,Nat,Packets,我用c#制作客户端和服务器,并希望在这两个应用程序之间发送数据包。当客户端向服务器发送消息时,一切正常,服务器接受它。但当服务器尝试回复时,客户端不会收到消息。我认为,这是一个问题,因为我有私有ip(我不确定,但我认为它是NAT-1IP和许多计算机),我的服务器运行在我的VPS上。 那么,如何从服务器回复客户机呢 客户端代码: void SendDataToServer(string Message) { IPAddress Ip = Dns.GetHostEnt
void SendDataToServer(string Message)
{
IPAddress Ip = Dns.GetHostEntry("mydomain.com").AddressList[0];
int Port = 1234;
IPEndPoint Server = new IPEndPoint(Ip, Port);
byte[] MessageInBytes = Encoding.UTF8.GetBytes(Message);
MySocket.SendTo(MessageInBytes, Server);
}
void ReceiveDataFromServer(int Port) // this is running in background
{
UdpClient Client = new UdpClient(Port);
IPEndPoint Server = new IPEndPoint(IPAddress.Any, Port);
try
{
while (true)
{
byte[] MessageInBytes = Client.Receive(ref Server);
string Message = Encoding.UTF8.GetString(MessageInBytes, 0, MessageInBytes.Length);
MessageBox.Show(Message);
}
}
catch (Exception e)
{
MessageBox.Show(e);
}
}
服务器代码:
static void StartReceiveing(int Port) // this is running in background
{
UdpClient Server = new UdpClient(Port);
IPEndPoint Client = new IPEndPoint(IPAddress.Any, Port);
try
{
while (true)
{
byte[] MessageInBytes = Server.Receive(ref Client);
string Message = Encoding.UTF8.GetString(MessageInBytes, 0, MessageInBytes.Length);
Console.WriteLine("Received message: " + Message);
Task.Run(() => ReplyToClient("some text", Client));
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
static void ReplyToClient(string Message, IPEndPoint Client)
{
try
{
byte[] MessageInBytes = Encoding.UTF8.GetBytes(Message);
NetClient.SendTo(MessageInBytes, Client);
Console.WriteLine("Sending reply: " + Message);
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
在您的服务器代码中,什么是“NetClient”?您应该使用
服务器
变量发送回复,因此回复将从上接收数据包的同一端口发送,这将确保数据包返回到NAT后面的客户端。抱歉,我忘记了这一点。Socket NetClient=新套接字(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);MySocket是一样的。但是,如果我将应答发送到同一端口,我必须更改Client上的侦听端口吗?或者没有?好的,正如前面提到的,您不应该使用它来发送回复,使用您现有的UdpClient服务器=新的UdpClient(端口)代码>发送回复。仍不工作。我更改此行:Server.Send(MessageInBytes,MessageInBytes.Length,Client);我认为这是客户端的问题,因为在更改此行之前和之后,我在控制台中有日志:received from:xxx.xxx.xxx:abcde和消息:Send reply to:xxx.xxx.xxx:abcde。所以,我认为它发送到正确的端口,但我的客户不接受它?也许我必须改变客户端的监听端口或者别的什么?但几乎所有消息都来自其他端口。