Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# UDP钻孔问题_C#_Python_Udp_Hole Punching - Fatal编程技术网

C# UDP钻孔问题

C# UDP钻孔问题,c#,python,udp,hole-punching,C#,Python,Udp,Hole Punching,因此,我编写了一个简单的python服务器,用于设置P2P连接(用于我正在制作的游戏) 服务器代码很简单(python): 它侦听传入的UDP消息,并使用客户端的公共ip:port信息(例如“xxx.yyy.zzz.aaa:port”)进行响应 客户端从服务器接收此信息,并在Firebase上更新其ip:port信息。firebase游戏大厅中的所有玩家都可以看到他们的对手ip:portinfo 然而,下一部分——P2P——不起作用。 一旦客户机将其对手公开ip:port信息并开始发送UDP数据

因此,我编写了一个简单的python服务器,用于设置P2P连接(用于我正在制作的游戏)

服务器代码很简单(python):

它侦听传入的UDP消息,并使用客户端的公共ip:port信息(例如“xxx.yyy.zzz.aaa:port”)进行响应

客户端从服务器接收此信息,并在Firebase上更新其ip:port信息。firebase游戏大厅中的所有玩家都可以看到他们的对手ip:portinfo

然而,下一部分——P2P——不起作用。 一旦客户机将其对手公开ip:port信息并开始发送UDP数据包,他们就不会到达

有人知道问题是什么吗

*****编辑***** 我已经解决了这个问题。。根据我提供的上述信息,任何人都无法回答。在收到服务器的第一个响应后,我愚蠢地没有更新端口以接收新的udp数据包。感觉很傻。 无论如何,UDP holepunching系统似乎正在工作。
我的服务器是上面的python代码,客户端是一个带有firebase后端的unity游戏(c#)。如果有人有问题,请告诉我。

路由器上的侦听端口必须打开。您需要执行添加UPNP注册的额外步骤

这是一个没有安装的库,因此没有pip安装

这是一个可以pip安装的库


在README.md中,这两个版本都有很好的使用示例,谢谢您提供的信息!我将研究UPnP文档和c#实现(游戏在c#中)。尽管我的印象是UDP打孔可以在没有任何附加协议的情况下完成。来自@Dennis19901的评论:您能分享一段实现的UDP打孔的代码片段吗?我计划自己尽快完成这项工作,这将节省我大量的研究时间@gofr1-你对哪一部分感兴趣?服务器(python)代码,还是C#P2P客户端代码?感谢您的反馈。我发布了@Dennis19901的问题,我希望他很快会来澄清他的问题!:)感谢您通知我@gofr1我对P2P客户端代码最感兴趣。如何先设置到服务器的连接,然后设置到另一个客户端的连接。我猜服务器只是将远程IP从两个客户端传递给对方?@Dennis19901-我的设置布局有点混乱,因为它使用firebase服务器和python(linux)服务器来设置连接。基本上,玩家都在游戏大厅(使用firebase进行管理)。大厅被填满后,他们都会使用空UDP数据包ping python服务器。python服务器看到这些客户机的公共ip:port信息进入,并以它们自己的ip:port数据作为消息进行响应(见上文)。玩家从python服务器响应中获取ip:port数据(他们自己的),然后填写firebase游戏大厅上的字段。
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_address = ''
server_port = 5000
server = (server_address, server_port)
sock.bind(server)
print("Listening on " + server_address + ":" + str(server_port))
while True:
    payload, client_address = sock.recvfrom(1)  
    resp = client_address[0] + ":" + str(client_address[1])
    print("Echoing data back to " + str(client_address))
    sent = sock.sendto(str.encode(resp), client_address)