如果在多宿主客户端主机上调用bind
,那么tcp套接字中的源IP地址是什么?客户端有两个接口eth0(IP0)
和eth1(IP1)
,客户端tcp套接字绑定到IP0
。在客户端socket, bind, connect
之后,它会向服务器发送数据包。目标IP为servIP
。但servIP
和IP0
不在同一子网中(可能是servIP
和IP1
)。哪个是发送到服务器的数据包中的源IP? getsockname
将返回什么?
答案 0 :(得分:1)
这里有两个不同的问题:
1)要绑定哪个IP?
调用bind()时,您可以选择指定和绑定地址,也可以将此决定留给计算机上的TCP / IP堆栈。您可以在'addr'参数中传递特定地址或将其保留为INADDR_ANY。您可以在ip(7)的手册页中找到有关如何执行此操作的详细信息。如果调用bind()提供有效的IP地址并调用bind()成功,则使用绑定套接字发送的数据报将其源地址设置为调用bind()时提供的值。
2)如何路由数据包?
数据包的路由方式仅取决于目标地址,而不取决于源地址。可能是你的源地址是eth0的源地址,它将通过eht1发出。这是因为您的操作系统中的路由系统使用的是基于目标的路由,而不是基于源的路由。通过在操作系统的控制台中发出“route”命令并将输出与目标地址进行比较,您始终可以看到将使用哪个适配器