Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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++_Sockets_Networking_Tcp_Udp - Fatal编程技术网

C++ UDP:需要注意什么

C++ UDP:需要注意什么,c++,sockets,networking,tcp,udp,C++,Sockets,Networking,Tcp,Udp,我正在开发我的游戏引擎的多人游戏模块。我没有任何代码可以发布,因为服务器和客户端都在发送和接收我想要的东西,所以这是一个理论性更强的问题。我一直试图在互联网上找到答案,但似乎没有任何东西能为我指明正确的方向 基本上,我有一个基本服务器,可以连接到该服务器以查看统计数据,连接到其他游戏服务器,等等。整个客户机-服务器模型是TCP。然而,问题来自我的游戏服务器。在这种情况下,所有播放器和服务器之间的TCP连接都建立在某个端口上,我通过UDP向另一个端口上的服务器发送数据包。这样做的原因是,我可以将重

我正在开发我的游戏引擎的多人游戏模块。我没有任何代码可以发布,因为服务器和客户端都在发送和接收我想要的东西,所以这是一个理论性更强的问题。我一直试图在互联网上找到答案,但似乎没有任何东西能为我指明正确的方向

基本上,我有一个基本服务器,可以连接到该服务器以查看统计数据,连接到其他游戏服务器,等等。整个客户机-服务器模型是TCP。然而,问题来自我的游戏服务器。在这种情况下,所有播放器和服务器之间的TCP连接都建立在某个端口上,我通过UDP向另一个端口上的服务器发送数据包。这样做的原因是,我可以将重要的消息与不太重要的“状态”更新分开。在本地,这可以很好地工作,但是当我尝试“通过internet”时,数据包被发送但没有被接收

TCP连接确实是通过internet建立的,但UDP数据包不会到达它们的位置。我曾尝试在Windows防火墙(出站和入站)中添加规则,并在所有系统上进行了端口转发。事实上,我知道我的代码没有问题


两个系统都在64位Windows 7上运行。我每秒发送40次64字节的数据包,但没有一个通过,所以这不是“数据包丢失”问题

最后,我的问题是:还有哪些东西可以阻止UDP数据包?我需要考虑哪些事情?我已经过了忘记绑定()之类的阶段

我知道这是一个非常理论化的问题,也是一个广泛的问题,但我不确定还应该做什么,因为这个问题不再存在于代码中。我一定错过了一些简单的东西。非常感谢您的任何建议或建议。再一次,很抱歉这个问题如此广泛,但这是我最后的选择


谢谢

无法保证UDP数据包的传递。他们迷路的原因有上百个,从拥堵到政策封锁,再到

UDP是一种轻量级协议,适用于数据正在更改或状态不重要的应用程序。例如,VOIP经常使用UDP,因为数据流是动态的,半秒钟前丢弃的内容无关紧要


简言之,如果您需要有保证的交付,您必须使用TCP,这就是它的用途。

在您的情况下,我要尝试的第一件事是通过internet连接在两台机器之间以UDP模式(
nc-u
)使用netcat,并使其正常工作。通过这种方式,您可以双重确认您的软件中没有问题


根据你的描述,我认为这是一个防火墙问题。首先确保UDP数据包通过防火墙正常。防火墙中可能有多个阻止UDP数据包的设置。仅Linux的有状态数据包跟踪就可以阻止所有传入的UDP数据包,即使规则中没有明确提到这一点。

在这种情况下,我要做的第一件事是启动WireShark,并观察数据包传出,以确保一切正常。如果您能够在远程端运行数据包抓取器,这可能会告诉您更多信息,比如接收操作系统是否出于某种原因阻止了您。如果您看到数据包离开源但没有到达目的地,则它们在途中被丢弃。这可能发生在任何数量的防火墙或路由器上

我的家庭路由器配置为阻止所有入站UDP通信。这是一种比你想象的更普遍的情况。大多数家庭网络设备(可能还有windows防火墙)将阻止入站UDP流量,除非它们已经看到具有相同(sourceip、Destinp、sourceport、destport)签名的出站流量


通信两端的网络配置是什么样的?您使用的UDP端口是什么

谢谢你的快速回复,是的,我知道。然而,我想知道哪些配置更特定于操作系统和路由器,可能会阻止它。这不是什么“阻止它”的问题,而是没有任何地方会导致保证交付的问题。代码根本不存在。@EJP yes非常正确。如果我知道它们正在被发送(从我的机器和路由器发送),有什么可以在服务器端阻止它呢?对不起,我应该说得更清楚。任何事情都可以阻止它。缓冲区满;分组冲突;路由器的突发奇想;天啊,我每秒发送40次64字节的数据包,但都没有通过。缓冲区未满。对于UDP,我使用端口667;对于TCP,我使用端口666。我知道它在0-1024范围内,但我已经尝试了所有端口。如果对所有系统都有帮助的话,我会使用windows 7。对于网络配置,我会将所有TCP 666转发到服务器,以及UDP 667。TCP工作正常,但UDP是发送的,而不是接收的。我还在windows防火墙中创建了入站和出站规则,但这似乎没有改变任何事情。非常感谢您的回答。这太完美了。我并不是在找一个关于TCP和UDP之间区别的讲座,而是更多关于如何在代码之外纠正问题的讲座,这正是您所提供的。