当前位置: 技术问答>linux和unix
请问为什么我的socket能接收到两块网卡的数据??急
来源: 互联网 发布时间:2015-10-08
本文导语: 我的套接字为sock_fd = socket( PF_PACKET, SOCK_PACKET, htons(ETH_P_ALL) ); 并且按下面的方法bind在一个网卡上 iface_bind( int fd, int ifindex, char *ebuf ) { struct sockaddr_ll sll; memset( &sll, 0, sizeof(sll) ); sll.sll_family = AF_PACKET; s...
我的套接字为sock_fd = socket( PF_PACKET, SOCK_PACKET, htons(ETH_P_ALL) );
并且按下面的方法bind在一个网卡上
iface_bind( int fd, int ifindex, char *ebuf )
{
struct sockaddr_ll sll;
memset( &sll, 0, sizeof(sll) );
sll.sll_family = AF_PACKET;
sll.sll_ifindex = ifindex; -----请问这个值怎么设置?如果我想bind 在eth1上,这个ifindex是不是应该设置为1?
sll.sll_protocol = htons(ETH_P_ALL);
if( bind(fd, (struct sockaddr *) &sll, sizeof(sll)) == -1 ) {
sprintf( ebuf, "bind: %s", pcap_strerror(errno) );
return -1;
}
return 0;
}
但是很奇怪的是,用上面创建的套接字接收,居然能够同时收到我两块网卡的数据!感觉bind没有起作用啊,这是怎么回事?
我只想用这种套接字接收其中一块网卡的数据,请问各位高人怎么设置?
并且按下面的方法bind在一个网卡上
iface_bind( int fd, int ifindex, char *ebuf )
{
struct sockaddr_ll sll;
memset( &sll, 0, sizeof(sll) );
sll.sll_family = AF_PACKET;
sll.sll_ifindex = ifindex; -----请问这个值怎么设置?如果我想bind 在eth1上,这个ifindex是不是应该设置为1?
sll.sll_protocol = htons(ETH_P_ALL);
if( bind(fd, (struct sockaddr *) &sll, sizeof(sll)) == -1 ) {
sprintf( ebuf, "bind: %s", pcap_strerror(errno) );
return -1;
}
return 0;
}
但是很奇怪的是,用上面创建的套接字接收,居然能够同时收到我两块网卡的数据!感觉bind没有起作用啊,这是怎么回事?
我只想用这种套接字接收其中一块网卡的数据,请问各位高人怎么设置?
|
int if_get_id(int sock_fd, const char *device)//e.g. "eth0", "eth1"
{
struct ifreq ifr;
memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, device, sizeof(ifr.ifr_name));
if (ioctl(sock_fd, SIOCGIFINDEX, &ifr) == -1)
{
perror("ioctl failed");
return -1;
}
return ifr.ifr_ifindex;
}
{
struct ifreq ifr;
memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, device, sizeof(ifr.ifr_name));
if (ioctl(sock_fd, SIOCGIFINDEX, &ifr) == -1)
{
perror("ioctl failed");
return -1;
}
return ifr.ifr_ifindex;
}