我可以调用 bind() 然后在同一个套接字描述符上调用 connect() 吗?



只是一个关于使用 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地址之一,而不是您可以想象的任何地址。

最新更新