setsockopt绑定到特定interface

 转自:

setsockopt绑定到特定interface

http://hi.baidu.com/lewutian/item/6b8a2c80db48e929110ef314

(转)SOL_BINDTODEVICE

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


setsockopt()和getsockopt()的选项名称   选项 意义 期望值 SO_BINDTODEVICE

可以使socket只在某个特殊的网络接口(网卡)有效。

一个字符串给出设备的名称,或者一个空字符串返回默认值 SO_BROADCAST 允许广播地址发送和接收信息包,只对UDP有效。 布尔型整数 SO_DONTROUTE 禁止通过路由器和网关往外发送信息包。可以防止数据离开本地网络,起到安全保护的作用。 布尔型整数 SO_KEEPALIVE 可以使TCP通信的信息包保持连续性,在连接数很多,而且要持续连接时很有用,减少重新连接服务器的开销。 布尔型整数  SO_OOBINLINE 可以把收到的不正常数据看成是正常的数据;也就是说,会通过一个标准的对recv()的调用来接收这些数据 布尔型整数  SO_REUSEADDR 当socket关闭后,本地端用于该socket的端口号立刻就可以被重用。这个可以减少TIME_WAIT的存在 布尔型整数  SO_TYPE 重新得到socket类型(例如:SOCK_STREAM 或 SOCK_DGRAM)。只用于getsockopt() 整数

原文地址 http://neupest.blog.163.com/blog/static/53714126200932331436280/
 
setsockopt()和getsockopt()的选项名称
 
 
选项 意义 期望值 
SO_BINDTODEVICE 

可以使socket只在某个特殊的网络接口(网卡)有效。 

一个字符串给出设备的名称,或者一个空字符串返回默认值 
SO_BROADCAST 允许广播地址发送和接收信息包,只对UDP有效。 布尔型整数 
SO_DONTROUTE 禁止通过路由器和网关往外发送信息包。可以防止数据离开本地网络,起到安全保护的作用。 布尔型整数 
SO_KEEPALIVE 可以使TCP通信的信息包保持连续性,在连接数很多,而且要持续连接时很有用,减少重新连接服务器的开销。 布尔型整数  
SO_OOBINLINE 可以把收到的不正常数据看成是正常的数据;也就是说,会通过一个标准的对recv()的调用来接收这些数据 布尔型整数  
SO_REUSEADDR 当socket关闭后,本地端用于该socket的端口号立刻就可以被重用。这个可以减少TIME_WAIT的存在 布尔型整数  
SO_TYPE 重新得到socket类型(例如:SOCK_STREAM 或 SOCK_DGRAM)。只用于getsockopt() 整数 
 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值