WAN上的TCP / UDP套接字服务器

我在c#中编写了一个socket服务器,它将用作我所参与的小型游戏项目的基本设计。 套接字服务器在lan上运行良好。 我能够在服务器和客户端之间完全通信。 但是,在WAN上,服务器从客户端接收所有正确的消息,但客户端不从服务器接收消息。 客户端和服务器都在路由器后面,但只有服务器的路由器有端口转发。 当客户端连接到服务器时,我获得连接的IP地址。 由于客户端位于NAT后面,是否需要收集发件人的更多信息? 我假设客户端可以设置端口转发,但这对游戏来说非常适得其反。 我能得到的任何帮助表示赞赏。 如果您需要代码,请告诉我。 提前致谢。

用于从客户端建立TCP连接

public string ConnectionAttempt(string ServeIP, string PlayUsername) { username = PlayUsername; try { connectionClient = new TcpClient(ServeIP,TCP_PORT_NUMBER); connectionClient.GetStream().BeginRead(readbuffer, 0, READ_BUFFER_SIZE, new AsyncCallback(DoRead), null); Login(username); ipAddress = IPAddress.Parse(((IPEndPoint)connectionClient.Client.RemoteEndPoint).Address.ToString()); servIP = new IPEndPoint(ipAddress,65002); listenUDP = new IPEndPoint(ipAddress, 0); UDPListenerThread = new Thread(receiveUDP); UDPListenerThread.IsBackground = true; UDPListenerThread.Start(); return "Connection Succeeded"; } catch(Exception ex) { return (ex.Message.ToString() + "Connection Failed"); } } 

在线程上侦听UDP消息。

 private void receiveUDP() { System.Net.IPEndPoint test = new System.Net.IPEndPoint(System.Net.IPAddress.Any, 0); System.Net.EndPoint serverIP = (System.Net.EndPoint)test; server.Bind(serverIP); 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); } } 

服务器TCP连接监听器:

 private void ConnectionListen() { try { listener = new TcpListener(System.Net.IPAddress.Any, PORT_NUM); listener.Start(); do { UserConnection client = new UserConnection(listener.AcceptTcpClient()); client.LineRecieved += new LineRecieve(OnLineRecieved); UpdateStatus("Someone is attempting a login"); } while (true); } catch { } } 

服务器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); string message = Encoding.ASCII.GetString(content); string[] data = message.Split((char)124); //UpdateStatus(data[0] + data[1]); UserConnection sender = (UserConnection)clients[data[0]]; sender.RemoteAdd = Remote; if (data.Length > 2) { OnLineRecieved(sender, data[1] + "|" + data[2]); } else { OnLineRecieved(sender, data[1]); } } } 

用户连接的设置信息服务器端:

 Socket trans = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); //UDP connection for data transmission in game. public PlayerLoc Location = new PlayerLoc(); public UserConnection(TcpClient client)//TCP connection established first in the Constructor { this.client = client; ipAdd = IPAddress.Parse(((IPEndPoint)client.Client.RemoteEndPoint).Address.ToString()); ipep = new IPEndPoint(ipAdd, ((IPEndPoint)client.Client.RemoteEndPoint).Port); this.client.GetStream().BeginRead(readBuffer, 0, READ_BUFFER_SIZE, new AsyncCallback(StreamReciever), null); } 

向个人用户发送数据的方法:

 public void SendData(string data)//UDP only used during transmission { byte[] dataArr = Encoding.ASCII.GetBytes(data); trans.SendTo(dataArr, dataArr.Length,SocketFlags.None, RemoteAdd); } 

客户端必须启动UDP通信,以便它可以在路由器/防火墙中获得“漏洞”。 并且UDP服务器必须使用ReceviedFrom引用的端点进行ReceviedFrom