将 TCP 数据发送到 NAT 后面的客户端

Sending TCP data to a client behind NAT

我正在开发一个 client/server 程序,其中有一台服务器(不在 NAT 后面)和许多使用 NAT 的客户端。我需要服务器能够经常向客户端传输文件,因此服务器必须能够在需要时启动 TCP 流量。我已经想出了如何通过缓存客户端的 IPEndPoints 并在以后使用它们来使用 UDP 执行此操作。

任何人都可以推荐一些示例代码或他们看到的可以做到这一点的项目(带源代码)吗?有很多 Chat 或 IM 项目可供学习,但它们通常只使用 UDP 跨 NAT 或者只在 LAN 上工作而不使用 NAT。带有解决方案的 C++/C#/VB 源代码会有很大帮助。谢谢。

您的最佳选择:

  1. 客户端定期轮询以发现是否有新文件可用。最简单的选择。这可能会或可能不会扩展,具体取决于有多少客户端以及他们需要轮询的频率。

  2. 所有客户端都与服务器保持持久的 TCP 连接。服务器准备好后将文件发送到特定客户端。避免了 #1 的轮询开销,但如果您没有将服务设计为针对 C10K problem.

  3. 扩展,则如果客户端数量达到数千,则可能会出现问题
  4. 客户端连接到通知服务器,该服务器旨在处理同时连接的多个客户端。客户端将其通知服务器参数发送到文件传输服务并断开连接。当文件服务器有可用的新文件时,服务器通过通知服务发送通知,告诉客户端重新连接等待文件。文件传输完成后客户端与文件服务器断开连接。