管理2个Internet连接

Manage 2 Internet Connections?

本文关键字:连接 Internet 2个 管理      更新时间:2023-10-16

我有一台Linux计算机,带有2个以太网适配器。我还有2个ADSL型号两个互联网连接。我将调制解调器A连接到以太网端口A,将调制解调器B连接到以太网接口B。

现在,如何执行以下操作(最好在C++中):

a)获取每个适配器的IP
b)选择要使用的连接进行下载(我想说:使用连接a下载此文件,使用连接b下载此文件)

IP是动态的。我这么做是因为远程服务器必须知道我的IP。

服务器必须:
a)获取IP
b)将文件发送到此IP

这个想法是,每次我的IP更改时,我都会将新的IP发送到服务器,这样服务器就会知道将文件发送到哪里。

我正在使用2个互联网连接:

a)冗余原因(如果一个互联网连接断开,我会得到第二个)
b)通过打开与服务器的2个连接,下载速度更快

如果您的目标是简单地更新IP地址的服务器,那么您只需要使用典型的TCP套接字连接到此服务器:

int sock = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in addrLocal = {};
result = connect(sock, (sockaddr*)&server_address, sizeof(server_address));
send(sock, "I have a new IP address", ...);

在上面的示例中,您甚至不必在套接字上调用bind,因为客户端TCP/IP堆栈会查阅计算机的路由表,以获得要使用的最佳本地IP地址(并会选择一个随机的本地端口)。

客户端甚至不需要知道其连接的IP地址,也不需要通过套接字协议告诉服务器。。反过来,服务器在接收到客户端连接时进行相应的接受呼叫时,可以自动检测您的IP地址。

sockaddr_in addrRemote = {};
socklen_t addrRemoteSize = sizeof(addrRemote);
int sockclient = accept(listensocket, (sockaddr*)&addrRemote, &addrRemoteSize);
// the IP address of the client making the connection is in addrRemote.

如果你的客户端只是打开服务器的套接字,那么服务器就可以将文件传输回客户端,而不必建立新的连接或跟踪任何IP地址。

现在来回答您最初的问题,以防您确实有合法的需要确定本地IP地址。

问题1:

要获得每个适配器的本地IP地址,可以调用getifadrs。从该函数返回的结果列表中,筛选出任何不是IP、不是UP或是LOOPBACK的地址。

问题2:

要将套接字绑定到特定适配器,请在进行连接调用之前绑定到本地适配器的IP地址。下的示例

result = bind(sock, (sockaddr*)&addr, sizeof(addr));
if (result != -1)
connect(sock, (sockaddr_in*)&remoteServer, sizeof(remoteServer));

其中,上面代码示例中的"addr"指向getifaddr返回的ifaddr数组中的一个ifa_dr值。

现在,如果这些连接中有一个NAT,那么您本地枚举的IP地址将与服务器看到的公共IP地址不同。

如果你使用的是UDP套接字,那么上面的所有内容仍然适用,只是做了一些调整。(例如,不要调用connect(),只调用sendto())。