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