特定接口上的 TCP/IP 连接
Posted
技术标签:
【中文标题】特定接口上的 TCP/IP 连接【英文标题】:TCP/IP connection on a specific interface 【发布时间】:2013-02-05 00:00:01 【问题描述】:我想使用两条网络路由之一连接到服务器。如何做到这一点?我用谷歌搜索了很多,常见的答案是摆弄路由表,但这无济于事,因为目的地只有一个 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 客户端
【问题讨论】:
在 linux 上,您可以使用 SO_BINDTODEVICE(如果您有两个设备)或在连接之前使用普通的 bind() 来区分本地 IP。 谢谢,但使用的是 Windows 客户端 Windows 绑定具有相同的功能,您指定要绑定到哪个 IP:msdn.microsoft.com/en-us/library/windows/desktop/… 【参考方案1】:在调用connect()
、ConnectEx()
或WSAConnect()
之前,使用bind()
函数将套接字绑定到192.168.1.3
或192.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);
【讨论】:
Indy 在 Windows 上支持吗? @MehmetFide 是的。TIdTCPClient
具有 BoundIP
和 BoundPort(Min|Max)
属性用于此确切目的以上是关于特定接口上的 TCP/IP 连接的主要内容,如果未能解决你的问题,请参考以下文章
socket跟TCP/IP 的关系,单台服务器上的并发TCP连接数可以有多少
Docker:服务器是不是在主机“localhost”(::1) 上运行并接受端口 5432 上的 TCP/IP 连接?