只是一个关于使用 C/C++ 的 Windows 应用程序中的网络套接字编程的奇怪问题:
如何告诉connect()
函数使用特定的源 IP 和源端口值?
-
创建套接字后,应用程序使用
sockaddr
结构调用connect()
远程 IP 和端口。 -
connect()
函数在内部选择连接的源 IP 和端口。
与其由系统决定connect()
的源 IP 和/或端口,不如让应用程序负责决定绑定到哪个源 IP 和/或端口。
如何告诉 connect(( 函数使用特定的源 IP 和源端口值?
为此,请使用套接字库的bind()
函数。 是的,您可以在connect()
传出套接字之前呼叫bind()
。 对于UDP和TCP套接字来说,这是一个完全合法的操作。
bind()
请求未使用的端口,以便它可以声明它并成为服务器,而connect()
需要一个已经在使用的端口,以便它可以连接到它并与服务器通信。
正如用户 stark 所说,如果要指定要使用的接口/端口组合,则需要调用bind
,尽管如果您希望下一次调用将其绑定到随机可用的端口号,您可以选择退出bind()
调用,因为客户端不一定必须具有固定的端口号。
可以要求内核在调用connect()
之前选择特定的端口,但如果我可以问 - 为什么你不想让内核分配源端口,据我所知这不是最佳实践。
是的,你可以。 事实上,这样做是有原因的: 如果您的路由策略要求从您不想使用的 IP 地址建立连接,则可以通过bind(2)
系统调用强制多宿主/路由主机将特定 IP 地址作为源。 另一个用途是为连接指定固定源端口,但这不像前一种情况那样常见。
但请注意:您只能选择已配置的IP地址之一,而不是您可以想象的任何地址。