【问题标题】:bind before connect at client code在客户端代码连接之前绑定
【发布时间】:2010-12-10 00:30:36
【问题描述】:

我有多个以太网 I/F。 eth0,eth1,eth2... 我想连接到外部服务器,例如 1.2.3.4:80。

我的连接没问题,但在某些特殊情况下我想连接为 eth1 而不是 eth0。服务器的代码检查我的接口的 IP 地址。我认为我需要在连接之前绑定。如果没有 bind(2),服务器总是从 eth0 获取数据包

我正在寻找演示此行为的代码。有人有示例的链接吗?

【问题讨论】:

    标签: c linux network-programming


    【解决方案1】:

    您不需要bind(2)

    您在这里要做的是使用与您的套接字不同的网络接口。要使用系统默认以外的网络接口,您需要使用SO_BINDTODEVICE 套接字选项和setsockopt。您要使用的接口,例如"eth1",应指定为ifreq structifr_name 字段中的字符串,该字段将传递给setsockopt。为此,您需要包含 <net/if.h> 标头。

    基本上,类似于以下(未经测试的)代码:

    int set_interface(int socket_fd, const char* interface_name)
    {
        ifreq interface;
        memset(&interface, 0, sizeof(interface));
        strncpy(interface.ifr_name, interface_name, IFNAMSIZ);
        int res = setsockopt(socket_fd, SOL_SOCKET, SO_BINDTODEVICE, &ifreq, sizeof(ifreq));
        return res;
    }
    

    另外,请务必检查返回码,以防 setsockopt 失败。

    【讨论】:

    • bind 和 SO_BINDTODEVICE 有什么区别?为什么 bind 不能解决我的问题?
    • @cateof, bind(2) 将套接字绑定到特定端点(IP 地址和端口)。它没有“网络接口”的概念。要将套接字与某个网络接口相关联,您需要使用 <net/if.h> 标头中的特殊工具。
    猜你喜欢
    • 2023-01-05
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    相关资源
    最近更新 更多