我正在运行服务器(比如端口50000)。每次接受任何新请求并由OS分配随机端口。我想手动分配端口号而不是系统随机为我做。
这个的主要原因是我试图根据端口号做一些组播事情。我打算在同一个端口上分配几个客户端。另一个端口上的客户端的下一个插槽,依此类推。
有什么想法吗?
答案 0 :(得分:1)
TCP套接字由客户端IP /端口和服务器端IP /端口对的元组标识。服务器端IP /端口是通过在bind()
之前调用listen()
来决定的。客户端IP /端口是通过bind()
之前调用connect()
明确决定的,或者通过省略bind()
并让connect()
决定来隐式决定。当accept()
接受连接时,会为其分配创建它的客户端IP /端口以及接受它的服务器端IP /端口。
这里唯一可用的随机选项是客户端。它可以在没有前面的connect()
的情况下调用bind()
,也可以使用零IP /端口调用bind()
。在任何一种情况下,操作系统选择适当的网络适配器并在未明确说明的情况下分配其IP,并且如果没有明确说明,则分配随机可用的短暂端口。如果需要,调用bind()
允许客户端分配这两个值中的一个/两个。在大多数情况下,bind()
通常不在客户端使用,但在处理特定协议要求或防火墙/路由器问题时,在需要时允许使用{{1}}。
仅靠端口跟踪客户端还不够好。您需要跟踪完整的元组,或者至少跟踪元组的客户端IP /端口对。来自同一网络的客户端将使用相同的客户端IP但使用不同的端口,但来自不同网络的客户端将使用不同的客户端IP并且可能使用相同的客户端端口,这是完全可以的。因此,单独使用Port可能会从错误的网络中找到错误的客户端。您还需要考虑客户端IP。
当服务器接受连接时,服务器无法控制更改元组的值。操作系统需要值可预测,因此它可以正确地路由数据包。如果要将数据包发送到特定客户端,则需要知道客户端IP和端口。
如果要在接受的连接的元组中使用不同的服务器端IP /端口值,唯一的选择是打开多个与所需服务器端值绑定的侦听套接字。