管理2个Internet连接
Manage 2 Internet Connections?
我有一台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())。
- 当套接字连接断开时检测C/C++Unix
- 无法在windows上使用mingw将sqlite3与c连接
- 到连接组件算法的问题(递归)
- QTcpSocket在不阻塞GUI的情况下重新连接到服务器
- 无法在C++中建立与MySQL数据库的连接
- PC中的程序和PHONE中的本机描述应用程序之间的数据连接
- 在Qt Creator中,如何在连接到正在运行的进程后查看控制台输出
- 连接 dockerized 模型和 dockerized 数据库时出现"无法 SQLConnect"错误
- 使用 bfs 解决连接组件问题时得到错误的答案
- 在C++的两个字符串中连接以逗号分隔的唯一值
- 如何修复valgrind启动时的致命错误(与libc6-dbg和libc6-dbg:i386连接)
- C 在Linux Ubuntu上检查Internet连接
- 为什么要在不同的连接(新的InternetOpen和New Internet Connect)上对HttpsendReq
- 如何不使用curl_easy_perform()上的现有连接,挂在Internet连接上
- 控制Internet连接
- 管理2个Internet连接
- 防止不需要Internet连接的桌面应用程序的盗版
- 在C++中检查Internet连接
- 使用internetcheckconnection在c++中检查Internet连接
- internet explorer语言 - 连接到正在运行的IE实例c++