特定接口上的TCP/IP连接

TCP/IP connection on a specific interface

本文关键字:IP 连接 TCP 接口      更新时间:2023-10-16

我想使用两个网络路由之一连接到服务器。一个人会怎么做?我在谷歌上搜索了很多,通常的答案是篡改路由表,但这无济于事,因为目的地只有一个IP地址。大多数示例的特点是客户端只有一个网卡,服务器有多个NIC,但在这种情况下情况恰恰相反。

ForceBindIP应用程序似乎能够提供这种类型的功能,所以我想这一定是可能的。

             +----->-------+
192.168.1.3  |      B      |          192.168.1.4
      +--------+      +--------+      +--------+
      | Client |      | Switch |-->---| Server |
      +--------+      +--------+      +--------+
192.168.1.2  |      A      |
             +----->-------+

我很可能会使用C++和winsock来实现这一点。我需要能够随意打开给定路由上的连接(即,不能静态绑定到特定路由)。我将使用普通的旧TCP/IP。

编辑:Windows 7客户端

在调用connect()ConnectEx()WSAConnect()之前,使用bind()函数将套接字绑定到192.168.1.3192.168.1.2。这告诉套接字用于传出连接的特定接口。例如:

SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
sockaddr_in localaddr = {0};
localaddr.sin_family = AF_INET;
localaddr.sin_addr.s_addr = inet_addr("192.168.1.3");
bind(s, (sockaddr*)&localaddr, sizeof(localaddr));
sockaddr_in remoteaddr = {0};
remoteaddr.sin_family = AF_INET;
remoteaddr.sin_addr.s_addr = inet_addr("192.168.1.4");
remoteaddr.sin_port = 12345; // whatever the server is listening on
connect(s, (sockaddr*)&remoteaddr, sizeof(remoteaddr));

或者:

addrinfo localhints = {0};
localhints.ai_flags = AI_NUMERICHOST | AI_NUMERICSERV;
localhints.ai_family = AF_INET;
localhints.ai_socktype = SOCK_STREAM;
localhints.ai_protocol = IPPROTO_TCP;
addrinfo *localaddr = NULL;
getaddrinfo("192.168.1.3", "0", &localhints, &localaddr);
bind(s, localaddr->ai_addr, localaddr->ai_addrlen);
freeaddrinfo(localaddr);
addrinfo remotehints = {0};
remotehints.ai_flags = AI_NUMERICHOST | AI_NUMERICSERV;
remotehints.ai_family = AF_INET;
remotehints.ai_socktype = SOCK_STREAM;
remotehints.ai_protocol = IPPROTO_TCP;
addrinfo *remoteaddr = NULL;
getaddrinfo("192.168.1.4", "12345", &remotehints, &remoteaddr);
connect(s, remoteaddr->ai_addr, remoteaddr->ai_addrlen);
freeaddrinfo(remoteaddr);