一尘不染

在连接客户端代码之前进行绑定

linux

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

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

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


阅读 274

收藏
2020-06-07

共1个答案

一尘不染

您不需要bind(2)这个。

您要在此处执行的操作是使用与套接字不同的 网络接口
。要使用系统默认设置以外的网络接口,您需要将SO_BINDTODEVICEsocket选项与一起使用setsockopt"eth1"例如,您要使用的接口应在要传递给ifr_nameifreqstruct字段中指定为字符串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失败。

2020-06-07