Routes 内核如何路由地址绑定套接字?

Routes 内核如何路由地址绑定套接字?,routes,linux-kernel,Routes,Linux Kernel,在连接到远程服务器之前,套接字调用了bind(),以绑定主机的一个ip地址。内核如何路由地址绑定套接字 来自上述内核的答案不应该路由到此套接字,因为它已绑定到特定地址 但来自的回答说,源地址对路由没有影响,只有目标地址对路由有影响 我想知道哪个是对的 我通过以下代码和tcpdump来测试它。在我的电脑中,Linux tuntest 4.15.0-122-generic 124 Ubuntu SMP周四10月15日13:03:05 UTC 2020 x86_64 x86_64 x86_64 GNU

在连接到远程服务器之前,套接字调用了
bind()
,以绑定主机的一个ip地址。内核如何路由地址绑定套接字

来自上述内核的答案不应该路由到此套接字,因为它已绑定到特定地址

但来自的回答说,源地址对路由没有影响,只有目标地址对路由有影响

我想知道哪个是对的

我通过以下代码和tcpdump来测试它。在我的电脑中,Linux tuntest 4.15.0-122-generic 124 Ubuntu SMP周四10月15日13:03:05 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux,第一个答案是正确的:总是通过绑定接口发送。有人能给我看看Linux内核中的相关源代码吗

#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
int袜子;
地址:cip、sip;
caddr中的结构sockaddr_,saddr;
cip=inet_addr(argv[1]);
如果(cip==INADDR\u无){
fprintf(stderr,“绑定地址%s无效\n”,argv[1]);
返回-1;
}
sip=inet_addr(argv[2]);
如果(sip==INADDR\u无){
fprintf(stderr,“服务器地址%s无效\n”,argv[2]);
返回-1;
}
caddr.sin_family=AF_INET;
caddr.sin_addr.s_addr=cip;
caddr.sin_端口=0;
sock=socket(AF\u INET,sock\u STREAM,0);
如果(sock==-1){
perror(“未能创建套接字:”);
返回-1;
}
printf(“绑定到%s…”,argv[1]);
如果(绑定(sock,(const struct sockaddr*)和caddr,sizeof(caddr))!=0){
perror(“未能绑定到本地”);
返回-1;
}
printf(“完成。\n”);
saddr.sin_family=AF_INET;
saddr.sin_addr.s_addr=sip;
saddr.sin_港=htons(443);
printf(“开始连接到服务器%s…”,argv[2]);
if(connect(sock,(const struct sockaddr*)和saddr,sizeof(saddr))!=0){
perror(“无法连接到服务器”);
返回-1;
}
printf(“完成。\n”);
返回0;
}

“我通过以下代码和tcpdump来测试它。”-请显示您的接口(
ipa
)、您的路由(
ipr
)以及如何在输出的同时运行上述程序,否则这句话没有任何意义。bind对数据包路由没有影响。它设置可以接收连接的端口和可选接口。如果您不在侦听并且不关心端口,则不需要调用bind。@stark bind有两个参数,一个是address,另一个是port。您可以绑定到地址而不指定端口(端口=0)。这里我们不是在讨论调用bind的必要性。我们只是在讨论呼叫如何影响路由。非常感谢。