簡體   English   中英

將套接字綁定到網絡接口

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM