如何获取我连接的接口

时间:2014-03-21 11:20:41

标签: c sockets raw-sockets getaddrinfo select-function

我正在尝试实现一个在tap接口上接收数据包(可能是ICMP)的应用程序。我有类似的代码。

strcpy(ifName, "tap0");
if ((sockfd = socket(PF_PACKET, SOCK_RAW,0) == -1) {
    perror("ERROR: socket");    
}
retVal = setsockopt(sockfd, SOL_SOCKET,  SO_REUSEADDR,
                        (char *)&sockopt, sizeof(sockopt)); // int sockopt

setsockopt(sockfd, SOL_SOCKET,SO_BINDTODEVICE, ifName, IFNAMSIZ-1);
max_sd = sockfd;
FD_SET(sockfd, &readfds);
// Similarly I have other fd's for tap1 and tap2 set to this &readfds

timeout.tv_sec  = 30;
timeout.tv_usec = 0;

retVal = select(max_sd + 1, &readfds, NULL,NULL,&timeout);

if(retVal == 1){
    // Now I know I got some message on one of the tap interface. How do I find out which
one ??
}

两个问题:

  1. 现在,一旦我收到选择的内容,如何找到数据包到达的分接接口?

  2. 此外,我该如何测试此代码。我有这些接口UP,我如何注入数据包,这样接收功能将起作用?有人能给出命令吗? ping应该工作(它发送ICMP数据包)。什么是正确的命令。我试过“ping -I tap0 localhost”

3 个答案:

答案 0 :(得分:1)

你可以保存fd的列表。只是一个示例代码

 // say you have 5 fd save in FD[] // have a mapping from fd's to tap interfaces
 // fd[1] -- tap1
 //fd[2] -- tap2 something like this
for(int i=0;i<5;i++){
   if(FD_ISSET(fd[i],&readfd)){
     //you have the fd, look up corresponding interface
  }
}

答案 1 :(得分:0)

您无法通过一个套接字找到数据包到达的适配器(或接口)。

每个接口设置一个套接字并使用两个套接字接收。

答案 2 :(得分:0)

您需要打开multiple sockets,每个界面一个。在任何其他接口上都不会看到在一个接口上收到的数据包。 :)

每个接口都有单独的RecvQ/TransQ