2

在最近的一系列问题中,我问了很多关于 UDP、boost::asio 和 c++ 的一般问题。

我最近的一个问题,在 Stackoverflow 上似乎没有答案,是这样的:

在客户端/服务器应用程序中,要求服务器在任何防火墙中打开一个端口以允许消息进入是完全可以的。但是,为客户端做同样的事情肯定不是一个很好的用户体验。

TCP 连接通常实现这一点,因为大多数路由器支持状态数据包检查,如果原始请求来自本地主机,则允许响应数据包通过。

我不太清楚这将如何与 UDP 一起工作,因为 UDP 是无状态的,并且没有“响应数据包”之类的东西(据我所知)。我应该如何在我的客户端应用程序中解决这个问题?

感谢您的任何回答!

4

1 回答 1

8

UDP 本身是无状态的,但防火墙通常不是。UDP 的约定是,如果请求从client:port_Ato 发出server:port_B,则响应将从server:port_Bto返回client:port_A

防火墙可以利用这一点。如果它看到一个 UDP 请求从客户端发出,它会在其状态表中添加一个条目,让它识别响应,以允许它们进入。因为 UDP 是无状态的并且没有连接终止的指示,防火墙将通常实现超时 - 如果在特定时间内该 UDP 地址对之间没有发生流量,则防火墙状态表中的关联将被删除。

所以 - 要在您的客户端应用程序中利用这一点,只需确保您的服务器从用于接收请求的同一端口发送回响应。

于 2011-02-03T01:28:34.470 回答