我有多个以太网I / F. eth0,eth1,eth2 ......我想连接到外部服务器,例如1.2.3.4:80。
我的连接没问题,但在某些特殊情况下我想连接为eth1而不是eth0。服务器的代码检查我的接口的IP地址。我认为我需要在连接之前绑定。如果没有bind(2),服务器总是从eth0
获取数据包我正在寻找演示此行为的代码。有人有一个示例链接吗?
答案 0 :(得分:10)
您不需要bind(2)
。
您在这里要做的是在套接字上使用不同的网络接口。要使用系统默认以外的网络接口,您需要使用SO_BINDTODEVICE
套接字选项和setsockopt
。您要使用的界面(例如"eth1"
)应指定为ifreq
struct的ifr_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
失败的情况下检查返回代码。