一般介绍socket的书籍中介绍socket的绑定都是绑定其ip地址。其对应的结构体是sockaddr_in。那么大家是否了解其它的结构体呢?
sockaddr,sockaddr_ll。可能大家都知道前者,因为在绑定的时候调用bind函数都要转换成sockaddr*的。所以就不介绍了,相信大家都了解了,如果不了解,google一下,非常详细。
那么对于sockaddr_ll,下边就介绍他
- struct sockaddr_ll
- {
- unsigned short sll_family;
- __be16 sll_protocol;
- int sll_ifindex;
- unsigned short sll_hatype;
- unsigned char sll_pkttype;
- unsigned char sll_halen;
- unsigned char sll_addr[8];
- };
绑定设备的时候只要把你要帮顶的设备的索引号赋给 sll_ifindex即可。
下边给一段使用它的代码:
- .....
- int skt = socket(PF_PACKET,SOCK_RAW, htons(ETH_P_ALL));
- int caplen = 65535;
- int ret = setsockopt(skt,SOL_SOCKET,SO_RCVBUF, &caplen, sizeof(caplen));
- struct ifreq ifstruct;
- strcpy(ifstruct.ifr_name, argv[1]);
- ioctl(skt, SIOCGIFINDEX, &ifstruct);
- sockaddr_ll sll;
- memset( &sll, 0, sizeof(sll) );
- sll.sll_family = AF_PACKET;
- sll.sll_ifindex = ifstruct.ifr_ifindex;
- sll.sll_protocol = htons(ETH_P_ALL);
- int rc = bind(skt, (struct sockaddr *)&sll, sizeof(sll));
- ...
原文出处:http://blog.csdn.net/wfqxx/archive/2009/06/23/4290619.aspx
(wfqxx) |