0

我正在尝试实现一个在分接接口上接收数据包(可能是 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”

4

3 回答 3

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
  }
}
于 2014-03-21T18:44:03.207 回答
0

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

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

于 2014-03-21T11:55:09.873 回答
0

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

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

于 2014-03-21T11:41:47.213 回答