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

C 在客户端代码处连接之前绑定,c,linux,network-programming,C,Linux,Network Programming,我有多个以太网I/F。eth0,eth1,eth2。。。我想连接到一个外部服务器,例如1.2.3.4:80 我的连接正常,但在某些特殊情况下,我希望以eth1而不是eth0进行连接。服务器的代码检查我接口的IP地址。我想我需要先绑定再连接。如果没有绑定(2),服务器总是从eth0获取数据包 我正在寻找演示这种行为的代码。有人有链接到示例吗?你不需要绑定(2) 您希望在这里做的是使用不同的网络接口与您的套接字。要使用系统默认设置以外的网络接口,您需要使用SO\u BINDTODEVICEsocke

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

我的连接正常,但在某些特殊情况下,我希望以eth1而不是eth0进行连接。服务器的代码检查我接口的IP地址。我想我需要先绑定再连接。如果没有绑定(2),服务器总是从eth0获取数据包

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

你不需要绑定(2)

您希望在这里做的是使用不同的网络接口与您的套接字。要使用系统默认设置以外的网络接口,您需要使用
SO\u BINDTODEVICE
socket选项以及
setsockopt
。您想要使用的接口,例如
“eth1”
,应该在要传递给
setsockopt
ifr\u name
字段中指定为字符串。为此,您需要包含
标题

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


另外,如果
setsockopt
失败,请确保检查返回代码。

bind和SO_BINDTODEVICE之间的区别是什么?为什么bind不能解决我的问题?@cateof,
bind(2)
将套接字绑定到特定的端点(IP地址和端口)。它没有“网络接口”的概念。要将套接字与某个网络接口相关联,需要使用
标题中的特殊功能。
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;
}