OS X相当于SO_BINDTODEVICE的功能

3

Linux允许执行以下代码将套接字绑定到特定的网络接口。因此,通过该套接字发送的数据将始终通过原始接口进行通道传输。

setsockopt(socket, SOL_SOCKET, SO_BINDTODEVICE, name, strlen(name))

据我所知,这个功能在VPN客户端中使用。套接字连接到远程服务器并绑定到网络接口。这样,VPN客户端本身的流量就不会被反弹回VPN客户端。是否有OS X相当于这样做的方法?要么将套接字绑定到某个特定接口,要么标记VPN客户端中的套接字不要被反弹回来。顺便说一下,我发现了类似的问题,但我不理解答案:Writing an OS X kernel extension to implement Linux's SO_BINDTODEVICE socket option。更新1:我发现一些VPN客户端使用TUN/TAP设备来防止反弹问题。http://backreference.org/2010/03/26/tuntap-interface-tutorial/。然而,我不确定所有OS X VPN都使用它。
4个回答

5

是的,使用 IP_BOUND_IF

int idx = if_nametoindex("en0");
setsockopt(sockfd, IPPROTO_IP, IP_BOUND_IF, &idx, sizeof(idx))

不过,您可以直接使用bind()函数并绑定接口的IP地址,这样通常更容易。


2

使用getifaddrs()来识别设备的地址,然后直接绑定到该地址是否有效?或者SO_BINDTODEVICE除了传统的bind()调用之外还有其他行为?

int BindToDevice(int sock, int family, const char* devicename)
{
    ifaddrs* pList = NULL;
    ifaddrs* pAdapter = NULL;
    ifaddrs* pAdapterFound = NULL;
    int bindresult = -1;

    int result = getifaddrs(&pList);

    if (result < 0)
        return -1;

    pAdapter = pList;
    while (pAdapter)
    {
        if ((pAdapter->ifa_addr != NULL) && (pAdapter->ifa_name != NULL) && (family == pAdapter->ifa_addr->sa_family))
        {
            if (strcmp(pAdapter->ifa_name, devicename) == 0)
            {
                pAdapterFound = pAdapter;
                break;
            }
        }
        pAdapter = pAdapter->ifa_next;
    }

    if (pAdapterFound != NULL)
    {
        int addrsize = (family == AF_INET6)?sizeof(sockaddr_in6):sizeof(sockaddr_in);
        bindresult = bind(sock, pAdapterFound->ifa_addr, addrsize);
    }

    freeifaddrs(pList);
    return bindresult;
}

我曾经认为bind()只用于listen()和accept()的情况。然而,在我的情况下,我想要进行connect(),因为这个套接字是给客户端使用的。 - Victor Ronin
只要路由表允许,它也可以与客户端(连接)套接字一起使用。 - selbie

0
这对我有用:
char ethInterface[4] = "en0";
setsockopt(sock, SOL_SOCKET, IP_RECVIF, ethInterface, strlen(ethInterface));

-1 这听起来不太对。根据斯蒂文斯的说法,这个选项 不是 用于指定接收/发送接口的名称,而是用于以下目的:“此套接字选项会导致 UDP 数据报接收时接收该数据报的接口索引作为辅助数据被 recvmsg 返回。” - Bruno Rijsman

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接