我能在同一个套接字描述符上调用bind()和connect()吗?

4

关于在使用C/C++编写Windows应用程序中的网络套接字编程,有一个好奇的问题:

我该如何告诉connect()函数使用特定的源IP和源端口值?

  • 创建套接字后,应用程序通过使用sockaddr结构调用connect()来连接到远程IP和端口。

  • connect()函数内部选择连接的源IP和端口。

与其让系统决定connect()的源IP和/或端口,不如由应用程序负责决定绑定到哪个源IP和/或端口。


如果套接字s未绑定,则系统会为本地关联分配唯一值,并将套接字标记为已绑定。 - Neijwiert
1
如果您想指定使用哪个接口/端口组合,您需要调用 bind - stark
“让应用程序决定绑定到哪个源端口或IP地址”--请注意,虽然对于要连接的套接字采取这种方法可能确实有原因,但最多只是罕见的。这种连接的源端口在应用程序级别通常不重要,并且很少有源IP的选项(除非机器正在连接自身)。 - John Bollinger
3个回答

4
我如何告诉 connect() 函数使用特定的源 IP 和源端口值呢?
可以使用 socket 库的 bind() 函数来实现。是的,在对于发出的套接字,你可以在调用 connect() 之前调用 bind()。对于 UDP 和 TCP 套接字而言,这是一种完全合法的操作。

4
bind() 请求一个未被占用的端口,以便可以声明该端口并成为服务器;而connect()则需要一个已被占用的端口,以便可以连接到它并与服务器通信。
正如用户stark所说,如果您想指定使用哪个接口/端口组合,则需要调用bind,尽管如果您希望下一次调用将其绑定到随机可用的端口号,则可以选择退出bind()调用,因为客户端不一定必须具有固定的端口号。
在调用connect()之前,可以要求内核选择特定的端口,但如果我可以问一下——为什么您不希望内核分配源端口?据我所知,这不是最佳实践。

我能想到的一些用例:可以将套接字绑定到一个接口而不绑定到一个端口(在这种情况下,当调用connect时,端口将被选择)。此外,在P2P网络中,在调用connect之前需要进行显式端口分配以启用NAT穿透。 - Bar Stool

1
是的,你可以这样做。确实有一个原因:如果您的路由策略使您的连接建立在不是您想要使用的IP地址上,您可以通过bind(2)系统调用在多宿主/路由主机中强制指定IP地址作为源。另一个用途是为连接指定固定的源端口,但这不像前面的情况那么常见。

但要注意:您只能选择已经配置好的IP地址之一,而不能选择您可以想象的任何地址。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接