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

时间:2019-06-12 15:18:41

标签: c++ c visual-c++ network-programming

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

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

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

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

由系统来决定绑定到哪个源IP和/或端口,而不是由系统确定connect()的源IP和/或端口。

3 个答案:

答案 0 :(得分:2)

  

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

为此使用套接字库的bind()函数。是的,您可以在bind()之前调用connect()来拨出套接字。对于UDP和TCP套接字,这都是完全合法的操作。

答案 1 :(得分:2)

bind()请求未使用的端口,以便可以声明它并成为服务器,而connect()想要一个已使用的端口,因此它可以连接到该端口并与该端口通信服务器。

正如用户 stark 所说,如果要指定要使用的接口/端口组合,则需要调用bind,尽管如果要下一次调用将其绑定到一个可用的随机端口上,端口号,您可以从bind()呼叫中退出,因为客户端不一定必须具有固定的端口号。

可以在调用connect()之前要求内核选择特定的端口,但是我可能会问-就我所知,为什么您不希望内核分配源端口?练习。

答案 2 :(得分:0)

是的,可以。 确实有这样做的理由:如果您的路由策略使您的连接不是从您要使用的IP地址建立的,则可以强制使用多宿主/路由主机通过for系统调用将特定的IP地址作为源。另一个用途是为连接指定一个固定的源端口,但这与以前的情况不同。

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