[英]bind socket to network interface
如何將套接字綁定到特定的網絡接口? 我嘗試在服務器端使用setsockopt
,但是客戶端仍然可以通過eth0和lo接口訪問服務。
我可以通過使用serv_addr.sin_addr.s_addr
設置特定的IP地址來serv_addr.sin_addr.s_addr
。
但是我懷疑我們可以僅使用setsockopt
綁定到接口(不提及IP地址)。
您可以通過設置SO_BINDTODEVICE
套接字選項來綁定到特定接口。
struct ifreq ifr;
memset(&ifr, 0, sizeof(ifr));
snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "eth0");
if (setsockopt(s, SOL_SOCKET, SO_BINDTODEVICE, (void *)&ifr, sizeof(ifr)) < 0) {
... error handling ...
}
警告 : 您必須是root並具有CAP_NET_RAW
功能才能使用此選項。
第二種方法是您可以使用getifaddrs()解析與接口綁定的IP地址。
請點擊后一個鏈接以獲取完整示例。
正如您提到的,唯一的方法是-
通過使用
serv_addr.sin_addr.s_addr
設置特定的IP地址
如果不知道要綁定的地址,就不能這樣做。
您可以根據需要使用ioctl
來確定當前的IP地址,盡管這些天可能有一種更聰明的方法-我最近在現代Linux發行版中做的並不多。
也許有人會覺得它有用,所以我分享了對我有用的解決方案(Linux,C ++):
uint32_t interfaceIndex = if_nametoindex(interfaceName);
其中“ interfaceName”是我們要綁定到的接口的名稱,例如“ eth0”(請參閱: https : //linux.die.net/man/3/if_nametoindex )。 現在,我們可以通過“ sin6_scope_id”在套接字地址結構中指定此接口(如果使用IPv6):
struct sockaddr_in6 socketAddress;
socketAddress.sin6_scope_id = interfaceIndex;
現在,我們可以照常通過“綁定”將套接字綁定到接口。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.