日期:2014-05-16  浏览次数:21108 次

怎样指定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));    //固定发送端口