当前位置: 技术问答>linux和unix
当主机多地址时,sendto()发送函数为什么携带的源IP地址永远都是第一个?
来源: 互联网 发布时间:2017-01-08
本文导语: 本人使用socket写了一个UCP服务端程序。主要就是接受,然后发送。 环境如下: eth0 = 192.168.15.15 eth0:1 = 192.168.15.16 一个eth0接口有2个同网段的地址, servaddr.sin_family = AF_INET; servaddr.sin_addr...
本人使用socket写了一个UCP服务端程序。主要就是接受,然后发送。
环境如下:
eth0 = 192.168.15.15
eth0:1 = 192.168.15.16
一个eth0接口有2个同网段的地址,
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);
if(bind(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)
{
exit(1);
}
while(1)
{
address_size = sizeof(cliaddr);
n = recvfrom(sockfd, buf, MAXLINE, 0, (struct sockaddr *)&cliaddr, &address_size);
printf("you ip is %s at port %d:%sn",
inet_ntop(AF_INET, &cliaddr.sin_addr,str,sizeof(str)),
ntohs(cliaddr.sin_port),buf);
n = sendto(sockfd, buf, strlen(buf)+1, 0, (struct sockaddr *)&cliaddr, address_size);
printf("n = %dn", n);
}
现在的问题是,不管客户端访问的是192.168.15.15(eth0)还是192.168.15.16(eth0:1).抓包发现sendto发送函数携带的源IP都是192.168.15.15(eth0),也就是说我访问192.168.15.15,回复我的却是192.168.15.16。为什么?
环境如下:
eth0 = 192.168.15.15
eth0:1 = 192.168.15.16
一个eth0接口有2个同网段的地址,
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);
if(bind(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)
{
exit(1);
}
while(1)
{
address_size = sizeof(cliaddr);
n = recvfrom(sockfd, buf, MAXLINE, 0, (struct sockaddr *)&cliaddr, &address_size);
printf("you ip is %s at port %d:%sn",
inet_ntop(AF_INET, &cliaddr.sin_addr,str,sizeof(str)),
ntohs(cliaddr.sin_port),buf);
n = sendto(sockfd, buf, strlen(buf)+1, 0, (struct sockaddr *)&cliaddr, address_size);
printf("n = %dn", n);
}
现在的问题是,不管客户端访问的是192.168.15.15(eth0)还是192.168.15.16(eth0:1).抓包发现sendto发送函数携带的源IP都是192.168.15.15(eth0),也就是说我访问192.168.15.15,回复我的却是192.168.15.16。为什么?
|
你的服务器IP地址用的是通配地址啊,所以外出的接口就由内核来给你选择了。
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
你这里指定一个固定的IP地址就不会这样了。把INADDR_ANY换成192.168.15.15或者是192.168.15.16
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
你这里指定一个固定的IP地址就不会这样了。把INADDR_ANY换成192.168.15.15或者是192.168.15.16