怎样指定ping数据包的发出接口
在我的设备上有3个接口:
int1 ip:10.10.1.1
int2 ip:10.10.2.2
int ip:10.10.3.3
去往9.9.9.9的路由可以从以上三个接口走,那么当我执行ping 9.9.9.9时icmp报文时从哪个接口出去的呢?如果我想指定从int1发送报文的话我该怎样写程序?
我的程序代码如下:
int do_detect(char *destnation)
{
int size=1024*10;
/*生成使用ICMP的原始套接字,这种套接字只有root才能生成*/
if( (sockfd=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP) )<0)
{ //perror("socket error");
return -1;
}
//回收root权限,设置当前用户权限*/
setuid(getuid());
/*扩大套接字接收缓冲区到10K这样做主要为了减小接收缓冲区溢出的
的可能性,若无意中ping一个广播地址或多播地址,将会引来大量应答*/
int nNetTimeout=1000; // 1秒
setsockopt(sockfd,SOL_SOCKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int));//发送时限
setsockopt(sockfd,SOL_SOCKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int));//接收时限
setsockopt(sockfd,SOL_SOCKET,SO_RCVBUF,&size,sizeof(size) );
bzero(&dest_addr,sizeof(dest_addr));
dest_addr.sin_family=AF_INET;
inet_aton(destnation,&dest_addr.sin_addr);
printf("\nbind ip %s return value :%d\n",inet_ntoa(myaddr.sin_addr),tmp);
pid=getpid();
send_packet(); /*发送所有ICMP报文*/
recv_packet(); /*接收所有ICMP报文*/
close(sockfd);
nsend=0;
nreceived=0;
return nreceived;
}
------解决方案--------------------
听说过bind么,不解释了。
------解决方案--------------------
在发送之前,把你的socket绑定到你想要的端口。
如:
C/C++ code
struct sockaddr_in ipSendFrom;
ipSendFrom.sin_family = AF_INET;
ipSendFrom.sin_addr.s_addr = INADDR_ANY;
ipSendFrom.sin_port = htons(10202);
bind(ipSendSock, (struct sockaddr *)&ipSendFrom, sizeof(ipSendFrom)); //固定发送端口