SOL_BINDTODEVICE是setsockopt設(shè)置中的一種套接口選項.當(dāng)套接口被綁定到
指定的網(wǎng)絡(luò)設(shè)備接口之后,只有來自該設(shè)備的數(shù)據(jù)包才會被套接口處理。
在Linux下,對網(wǎng)絡(luò)設(shè)備的引用是通過struct ifreq來完成.通過設(shè)置struct
ifreq中的ifr_name[IFNAMSIZ]來指定網(wǎng)絡(luò)設(shè)備接口.舉例如下:
struct ifreq interface;
char *inf = "eth0";
strncpy(interface.ifr_name, inf, IFNAMSIZ);
這樣再通過設(shè)置:
if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE,(char *)&interface, sizeof(interface)) < 0)
{
close(fd);
return -1;
}
就綁定到了接口"eth0"上,所有數(shù)據(jù)報的收發(fā)都只經(jīng)過這個接口.
對于SOL_BINDTODEVICE的總結(jié)如下:
(1) 對于TCP套接口、UDP套接口、RAW套接口,可以通過SO_BINDTODEVICE套接口選項將套接口綁定到指定的網(wǎng)絡(luò)接口上。綁定之后,套接口的所有數(shù)據(jù)包收發(fā)都只經(jīng)過指定的網(wǎng)絡(luò)接口;
(2) 對于PF_PACKET類型的套接口,不能通過SO_BINDTODEVICE綁定到指定的網(wǎng)絡(luò)接口上,而要通過bind(2)來與特定的網(wǎng)絡(luò)接口綁定,所用的套接口地址結(jié)構(gòu)為struct sockaddr_ll,此套接口地址結(jié)構(gòu)是鏈路層的地址結(jié)構(gòu),獨立于具體的網(wǎng)絡(luò)設(shè)備。比如,該地址結(jié)構(gòu)既可以用于表示PPP設(shè)備,也能用于表示ethernet設(shè)備。
(3) SO_BINDTODEVICE套接口選項只適用于Linux系統(tǒng)。如果要編寫運行在多操作系統(tǒng)平臺上的程序,不能依賴SO_BINDTODEVICE來完成套接口與具體設(shè)備的綁定。
轉(zhuǎn)自:
http://blog.chinaunix.net/u2/64516/showart_673646.html另有一篇比較不錯,講述如何使用setsockopt()和getsockopt()及套接口選項
http://hi.baidu.com/goodluckyyc/blog/item/7d3f442d6436b2eb8b1399ba.htmlsetsockopt()和getsockopt()的選項名稱
選項 意義 期望值
SO_BINDTODEVICE
可以使socket只在某個特殊的網(wǎng)絡(luò)接口(網(wǎng)卡)有效。
一個字符串給出設(shè)備的名稱,或者一個空字符串返回默認(rèn)值
SO_BROADCAST 允許廣播地址發(fā)送和接收信息包,只對UDP有效。 布爾型整數(shù)
SO_DONTROUTE 禁止通過路由器和網(wǎng)關(guān)往外發(fā)送信息包??梢苑乐箶?shù)據(jù)離開本地網(wǎng)絡(luò),起到安全保護(hù)的作用。 布爾型整數(shù)
SO_KEEPALIVE 可以使TCP通信的信息包保持連續(xù)性,在連接數(shù)很多,而且要持續(xù)連接時很有用,減少重新連接服務(wù)器的開銷。 布爾型整數(shù)
SO_OOBINLINE 可以把收到的不正常數(shù)據(jù)看成是正常的數(shù)據(jù);也就是說,會通過一個標(biāo)準(zhǔn)的對recv()的調(diào)用來接收這些數(shù)據(jù) 布爾型整數(shù)
SO_REUSEADDR 當(dāng)socket關(guān)閉后,本地端用于該socket的端口號立刻就可以被重用。這個可以減少TIME_WAIT的存在 布爾型整數(shù)
SO_TYPE 重新得到socket類型(例如:SOCK_STREAM 或 SOCK_DGRAM)。只用于getsockopt() 整數(shù)