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
Sockets 客户端套接字和服务器套接字绑定到同一端口_Sockets_Tcp - Fatal编程技术网

Sockets 客户端套接字和服务器套接字绑定到同一端口

Sockets 客户端套接字和服务器套接字绑定到同一端口,sockets,tcp,Sockets,Tcp,我有一个物联网设备(最有可能跨NAT),它应该与服务器(在互联网上)通信,服务器应该能够向设备发送命令。以下是高层沟通的详细信息: IoT设备将从端口9000(例如)向端口8000(例如)上的服务器发送KeepAlive数据包。服务器现在拥有端口和IP(比如Cp和Cip),如果需要,可以使用这些端口和IP启动与物联网设备的连接 服务器显然正在侦听端口8000上的连接。所以服务器有一个服务器套接字来监听物联网设备的keepalives KeepAlive数据包会定期发送,一旦服务器返回OK,连接就

我有一个物联网设备(最有可能跨NAT),它应该与服务器(在互联网上)通信,服务器应该能够向设备发送命令。以下是高层沟通的详细信息:

  • IoT设备将从端口9000(例如)向端口8000(例如)上的服务器发送KeepAlive数据包。服务器现在拥有端口和IP(比如Cp和Cip),如果需要,可以使用这些端口和IP启动与物联网设备的连接
  • 服务器显然正在侦听端口8000上的连接。所以服务器有一个服务器套接字来监听物联网设备的keepalives
  • KeepAlive数据包会定期发送,一旦服务器返回OK,连接就会关闭。这是为了确保套接字不会保持打开状态,从而节省服务器和物联网设备上的资源
  • 现在,假设我想向IoT设备发送一些命令,在这种情况下,我想在端口8000上打开服务器的套接字连接,并将数据包发送到Cip,Cp
  • 物联网设备应在其端口9000上接收此数据包。为此,物联网设备应打开服务器套接字以接受这些连接
  • 正如我们所看到的,客户端和服务器都必须打开特定端口上的服务器套接字,有时需要在该端口上创建客户端套接字来发送一些数据

    TCP是否适用于上述场景?我只是不知道客户端套接字和服务器套接字是否可以绑定到同一个端口

    请建议

    编辑1:
    • 我特意选择了上述设计,因为保持物联网设备到服务器的连接始终打开并不能扩展。假设我在现场有数百万台物联网设备,我现在需要对连接进行负载平衡
    • 服务器到物联网设备(向后)连接仅用于确保立即发送命令。前向连接(IoT设备到服务器)仅用于发送keepalives。定期进行(可能间隔5-10分钟)
    编辑2:
    固定端口(8000)的原因是:NAT只为接收keepalive数据包的目标端口的反向通信打开了一个洞。因此,只有在从服务器上的IoT设备接收到数据包的情况下,才能将反向数据包从服务器上的端口X发送到IoT设备。

    可能我不完全理解您的设置,但可能您的操作过于复杂。为什么不简单地打开从IoT客户端到服务器的TCP连接?此TCP连接可用于将数据从客户端发送到服务器,也可从服务器发送到客户端。它可以用来发送显式的Keep-Alive消息,也可以只使用TCP中内置的Keep-Alive机制。由于它是从客户端(NAT后面)到服务器(在internet上)打开的,因此NAT应该没有问题,如果您尝试创建从服务器到客户端的新连接,那么NAT应该没有问题。为什么该设备在通过客户端连接时需要8000个远程端口?这是真的吗?看起来不太可能。也不要求设备充当服务器。@SteffenUllrich:让连接保持打开状态意味着如果我在现场有100万台这样的物联网设备,那么服务器将需要保持这些打开的连接。非sequitur。IoT设备连接到服务器这一事实并不意味着服务器也需要连接回客户端,更不用说它需要源端口8000来连接。你实际上还没有澄清这一切。我建议您误解了。那么源端口8000的要求来自哪里?您是否意识到这可能意味着您的服务器一次只能连接到一个物联网设备?这不是一个可信的要求,也不可行。