我想要设置一个P2P匹配服务器。情况如下:
目前,对等点可以连接到服务器,注册他们的地址,并查询它的其他对等地址。我的问题是互相介绍同龄人。
我目前得到的内部和外部IP地址的每一个对等类似。它主要基于Lidgren附带的主服务器示例;然而,这只是将用户连接到客户机/服务器会话,而我需要对等连接。
//client code; getting our internal IP and sending it to the server
NetOutgoingMessage om = server_client.CreateMessage(); //create message on the server's connection
... //header
IPAddress mask;
var endpoint = new IPEndPoint(NetUtility.GetMyAddress(out mask), peer_client.Port); //gets the internal IP address
... //write message data and send to server当服务器收到请求时,或者当一个对等点被注册到服务器时,它从连接消息中获取该对等点的外部IP。然后,在处理请求时,我们可以从两个对等点访问两个IP:
//server code, handling the peer request message:
...
string key = msg.ReadString();
Output("Requesting peer: " + key);
IPEndPoint requester_internal = msg.ReadIPEndPoint();
IPEndPoint requester_external = msg.SenderEndPoint;
//attempt to find requested user
User u = null;
if (Users.TryGetValue(id, out u))
{
IPEndPoint target_internal = u.IPInternal;
IPEndPoint target_external = u.IPExternal;
...
//send the requested IPs to the sender, and the sender's IPs to the target.
}现在,问题是如何使用这些信息(或者,进行连接所需的任何其他信息)将对等点连接到对方,因为其他基础结构已经可以使用了。
我的第一次尝试是使用内置的导入方法:
//server code, continuing from the above
//instead of directly sending IPs to users, introduce them ourselves
s_server.Introduce(target_internal, target_external, requester_internal, requester_external, key);这似乎在某种程度上有效,但它连接到每个客户端上的服务器连接,而不是对等连接,并且只在发送方上成功。
试图手动连接发送的IP会导致无休止的“试图连接”消息:
//peer code; handling 'other peer data received' msg
IPEndPoint peer_internal = msg.ReadIPEndPoint();
IPEndPoint peer_external = msg.ReadIPEndPoint();
Output("SERVER: Recieved peer IP. Attempting to connect to:\n" + peer_internal.ToString() + "\n" + peer_external.ToString());
NetOutgoingMessage om = peer_client.CreateMessage();
om.Write((Int32)3); //unique header for debugging purposes
peer_client.Connect(peer_external, om); //tried both internal and external, no dice最后,我看到一个从服务器上转储的IP示例:
P1 Internal: 169.xxx.xxx.xxx:14243 //local subnet address, using the proper port
P1 External: xxx.xxx.xxx.xxx:62105 //IP address of the system, matching that from any IP testing site, but using a seemingly random port
P2 Internal: 169.xxx.xxx.xxx:14243 //same as above for the second peer
P2 External: xxx.xxx.xxx.xxx:62106我认为问题在于对等连接的外部端口是随机创建的,而不是使用我在创建时指定的端口。因此,不能提前转发。我很高兴用户被要求转发一个特定的端口,因为许多P2P游戏都是这样工作的。
换句话说,为了让纳特能正常工作,我似乎拥有我所需要的一切,但我缺乏利德格伦的知识来实现这一目标。
最后,下面是我如何设置我的peer_client:
//peer code: initialize the connection to any other peers we may connect to later
NetPeerConfiguration pconfig = new NetPeerConfiguration(appidstr_client);
pconfig.Port = 14243; //properly forwarded in router
pconfig.EnableMessageType(NetIncomingMessageType.DiscoveryRequest);
pconfig.SetMessageTypeEnabled(NetIncomingMessageType.UnconnectedData, true);
pconfig.AcceptIncomingConnections = true;
peer_client = new NetPeer(pconfig);
peer_client.Start();发布于 2014-07-19 08:00:12
您是否使用"config.EnableMessageType(NetIncomingMessageType.NatIntroductionSuccess);"?启用介绍性消息?
"14243“是个错误吗?在示例中,主服务器侦听14343,客户机侦听14242。
“这似乎在某种程度上有效,但它连接到每个客户端上的服务器连接,而不是对等连接,并且只在发送方上成功。”我不明白这意味着什么。如果您使用的是NetPeer类,那么没有特定的“服务器连接”?
请记住,IPEndPoint包括端口号,以防您将其存储在某个您希望将其设置为您试图打开的端口的某个位置。
https://stackoverflow.com/questions/24835230
复制相似问题