Chinaunix首页 | 论坛 | 博客
  • 博客访问: 478700
  • 博文数量: 174
  • 博客积分: 2502
  • 博客等级: 少校
  • 技术积分: 1923
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-28 09:47
文章分类

全部博文(174)

文章存档

2011年(8)

2010年(16)

2009年(68)

2008年(82)

我的朋友

分类:

2008-11-28 11:01:27

SOL_BINDTODEVICE是setsockopt设置中的一种套接口选项.当套接口被绑定到

指定的网络设备接口之后,只有来自该设备的数据包才会被套接口处理。

 

Linux下,对网络设备的引用是通过struct ifreq来完成.通过设置struct

ifreq中的ifr_name[IFNAMSIZ]来指定网络设备接口.举例如下:

struct ifreq interface;

char *inf = "eth0";

strncpy(interface.ifr_name, inf, IFNAMSIZ);

 

这样再通过设置:

if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE,(char *)&interface, sizeof(interface)) < 0)

{

    close(fd);

    return -1;

}

就绑定到了接口"eth0"上,所有数据报的收发都只经过这个接口.

 

对于SOL_BINDTODEVICE的总结如下:

 

(1)        对于TCP套接口、UDP套接口、RAW套接口,可以通过SO_BINDTODEVICE套接口选项将套接口绑定到指定的网络接口上。绑定之后,套接口的所有数据包收发都只经过指定的网络接口;

(2)        对于PF_PACKET类型的套接口,不能通过SO_BINDTODEVICE绑定到指定的网络接口上,而要通过bind(2)来与特定的网络接口绑定,所用的套接口地址结构为struct sockaddr_ll,此套接口地址结构是链路层的地址结构,独立于具体的网络设备。比如,该地址结构既可以用于表示PPP设备,也能用于表示ethernet设备。

(3)        SO_BINDTODEVICE套接口选项只适用于Linux系统。如果要编写运行在多操作系统平台上的程序,不能依赖SO_BINDTODEVICE来完成套接口与具体设备的绑定。

 

转自:http://blog.chinaunix.net/u2/64516/showart_673646.html

另有一篇比较不错,讲述如何使用setsockopt()和getsockopt()及套接口选项

http://hi.baidu.com/goodluckyyc/blog/item/7d3f442d6436b2eb8b1399ba.html

 

阅读(574) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~