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

cat*_*eof 9 c linux network-programming

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

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

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

Cha*_*via 10

你不需要bind(2)这个.

您在这里要做的是使用与套接字不同的网络接口.要使用系统默认以外的网络接口,您需要使用SO_BINDTODEVICE套接字选项setsockopt.您要使用的接口"eth1"(例如)应该在要传递给ifr_nameifreq结构字段中指定为字符串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;
}
Run Code Online (Sandbox Code Playgroud)

此外,请确保检查返回代码,以防setsockopt失败.

  • @cateof,`bind(2)`将套接字绑定到特定端点(IP地址和端口).它没有"网络接口"的概念.要将套接字与某个网络接口相关联,您需要使用`<net/if.h>`标头中的特殊工具. (3认同)