gpt4 book ai didi

c++ - 为每个连接手动分配端口号

转载 作者:太空宇宙 更新时间:2023-11-04 05:44:26 28 4
gpt4 key购买 nike

我正在运行一个服务器(例如在端口 50000 上)。任何新请求都会被接受,并且操作系统每次都会分配一个随机端口。我想手动分配端口号,而不是系统随机为我分配端口号。

这样做的主要原因是我正在尝试根据端口号执行一些多播操作。我计划在同一端口上分配几个客户端。另一个端口上的下一个客户端插槽,依此类推。

有什么想法吗?

最佳答案

TCP 套接字由客户端 IP/端口和服务器端 IP/端口对的元组来标识。服务器端的IP/端口是通过在listen()之前调用bind()来决定的。客户端 IP/端口是通过在 connect() 之前调用 bind() 显式决定的,或者通过省略 bind() 并让 connect() 决定来隐式决定。当accept()接受连接时,它会被分配建立连接的客户端IP/端口和接受它的服务器端IP/端口。

这里唯一可用的随机选项是在客户端。它可以在没有前面的 bind() 的情况下调用 connect(),也可以使用零 IP/端口调用 bind()。无论哪种情况,操作系统都会选择适当的网络适配器并分配其 IP(如果未明确说明),并分配随机可用的临时端口(如果未明确说明)。如果需要,调用 bind() 允许客户端分配其中一个/两个值。 bind() 在大多数情况下通常不会在客户端使用,但在处理特定协议(protocol)要求或防火墙/路由器问题时需要时允许使用。

仅通过端口跟踪客户端是不够的。您需要跟踪完整的元组,或者至少跟踪元组的客户端 IP/端口对。来自同一网络的客户端将使用相同的客户端 IP,但不同的端口,但来自不同网络的客户端将使用不同的客户端 IP,并且可以使用相同的客户端端口,这是完全可以的。因此,单独使用端口可能会从错误的网络找到错误的客户端。您还需要考虑客户端 IP。

当服务器接受连接时,服务器无法控制更改元组的值。操作系统需要这些值是可预测的,以便它可以正确路由数据包。当您想要向特定客户端发送数据包时,您需要知道客户端 IP 和端口。

如果您希望在接受连接的元组中具有不同的服务器端 IP/端口值,唯一的选择是打开与所需服务器端值绑定(bind)的多个监听套接字。

关于c++ - 为每个连接手动分配端口号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26816669/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com