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

时间:2010-12-10 00:30:36

标签: c linux network-programming

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

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

获取数据包

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

1 个答案:

答案 0 :(得分:10)

您不需要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失败的情况下检查返回代码。