我需要使用 WinSock 从特定的本地网卡打开一个套接字。我问了这个问题并在这里得到了答案。总之,答案建议你先绑定到本地接口,然后调用connect。
但是,当我这样做时,我得到一个 WSAEADDRNOTAVAIL (10049) “请求的地址在其上下文中无效。”。为什么是这样?
假设下面的示例代码是在本地机器 192.168.1.3 上运行的应用程序的一部分,并且正在尝试连接到远程服务器 192.168.1.4。我已经检查并仔细检查了本地和远程地址是否正确。我可以 ping 两种方式(从本地到远程和远程到本地)。
我已经为本地尝试了 0 以外的端口;没有不同。如果我在连接之前删除绑定,它就会起作用,但我无法指定网络接口。
那么,知道为什么我不断收到 WSAEADDRNOTAVAIL 吗?
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);
编辑:此示例代码故意没有错误检查,以便可以以最有效的方式传达我的意图。
编辑 2:绑定到 192.168.1.3 会导致连接失败。绑定到 127.0.0.1 有效。是的,我 100% 确定 192.168.1.3 是正确的本地 IP。
编辑3:对!一时兴起,我在家用 PC 上试用了测试应用程序,它运行良好。所以,至少代码确实有效,问题肯定与我的工作电脑有关。