我正在尝试实现一个在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 ??
}
两个问题:
现在,一旦我收到选择的内容,如何找到数据包到达的分接接口?
此外,我该如何测试此代码。我有这些接口UP,我如何注入数据包,这样接收功能将起作用?有人能给出命令吗? ping应该工作(它发送ICMP数据包)。什么是正确的命令。我试过“ping -I tap0 localhost”
答案 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
。