C++ 我可以在同一个套接字描述符上调用bind()和connect()吗?
只是一个关于使用C/C++在Windows应用程序中进行网络套接字编程的奇怪问题: 如何告诉C++ 我可以在同一个套接字描述符上调用bind()和connect()吗?,c++,c,visual-c++,network-programming,C++,C,Visual C++,Network Programming,只是一个关于使用C/C++在Windows应用程序中进行网络套接字编程的奇怪问题: 如何告诉connect()函数使用特定的源IP和源端口值 创建套接字后,应用程序使用sockaddr结构调用connect()到远程IP和端口 connect()函数在内部为连接选择源IP和端口 与其由系统决定connect()的源IP和/或端口,不如让应用程序负责决定绑定到哪个源IP和/或端口 如何告诉connect()函数使用特定的源IP和源端口值 为此,请使用套接字库的bind()函数。是的,对于传出套
connect()
函数使用特定的源IP和源端口值
- 创建套接字后,应用程序使用
结构调用sockaddr
到远程IP和端口connect()
函数在内部为连接选择源IP和端口connect()
connect()
的源IP和/或端口,不如让应用程序负责决定绑定到哪个源IP和/或端口
如何告诉connect()函数使用特定的源IP和源端口值
为此,请使用套接字库的bind()
函数。是的,对于传出套接字,您可以在connect()
之前调用bind()
。这对于UDP和TCP套接字来说都是完全合法的操作
如何告诉connect()函数使用特定的源IP和源端口值
为此,请使用套接字库的bind()
函数。是的,对于传出套接字,您可以在connect()
之前调用bind()
。这对于UDP和TCP套接字来说都是完全合法的操作。bind()
请求未使用的端口,以便它可以声明该端口并成为服务器,而connect()
需要一个已在使用的端口,以便它可以连接到该端口并与服务器通信
正如用户stark所说,如果要指定要使用的接口/端口组合,则需要调用bind
,但如果希望下一次调用将其绑定到随机可用的端口号,则可以选择退出bind()
调用,因为客户端不一定要有固定的端口号
在调用connect()
之前,可以要求内核选择一个特定的端口,但如果我可以问的话-为什么您不想让内核分配源端口,据我所知这不是最佳做法。bind()
请求未使用的端口,以便它可以声明它并成为服务器,而connect()
需要一个已经在使用的端口,以便它可以连接到该端口并与服务器通信
正如用户stark所说,如果要指定要使用的接口/端口组合,则需要调用bind
,但如果希望下一次调用将其绑定到随机可用的端口号,则可以选择退出bind()
调用,因为客户端不一定要有固定的端口号
在调用
connect()
之前,可以要求内核选择一个特定的端口,但如果我可以问的话-为什么您不希望内核分配源端口,据我所知,这不是最佳做法。是的,您可以确实有这样做的理由:如果您的路由策略使您的连接从一个您不想使用的IP地址建立,您可以通过bind(2)
系统调用强制多址/路由主机中的一个特定IP地址作为源。另一个用途是为连接指定一个固定源端口,但这与前一种情况不同
但是要注意:您只能选择一个已经配置好的IP地址,而不是您可以想象的任何地址。是的,您可以确实有这样做的理由:如果您的路由策略使您的连接从一个您不想使用的IP地址建立,您可以通过
bind(2)
系统调用强制多址/路由主机中的一个特定IP地址作为源。另一个用途是为连接指定一个固定源端口,但这与前一种情况不同
但请注意:您只能选择一个已配置的IP地址,而不能选择任何您可以想象的地址。如果您想指定要使用的接口/端口组合,则需要调用
bind
。“让应用程序负责决定要绑定的源端口或IP”--请注意,尽管对于要连接的套接字采用这种方法可能确实有一些原因,但它们充其量也很少见。这种连接的源端口在应用程序级别通常不重要,并且源IP很少有很多选项(除非计算机正在连接到自身)。如果要指定要使用的接口/端口组合,则需要调用bind
。“让应用程序负责决定要绑定到的源端口或IP”——请注意,尽管对于要连接的套接字,可能确实有理由采用这种方法,它们充其量也很少见。这种连接的源端口在应用程序级别通常不重要,而且源IP很少有很多选项(除非机器正在连接到自身)。我脑子里有几个用例:可以将套接字绑定到接口,而不必绑定到端口(这里的端口将在调用connect时选择。)此外,在P2P网络中,在调用connect之前需要显式的端口分配,以启用NAT遍历。我头脑中有几个用例:可以将套接字绑定到接口而不绑定到端口(这里的端口将在调用connect时选择)。此外,在P2P网络中,在调用connect之前需要显式的端口分配以启用NAT遍历。