我需要使用WinSock从特定的本地网卡打开一个套接字。我问了这个问题,得到了一个答案,here。简而言之,答案建议您首先绑定到本地接口,然后调用connect。
但是,当我这样做时,我会得到一个WSAEADDRNOTAVAIL (10049)“所请求的地址在其上下文中无效”。为什么会这样呢?
假设下面的示例代码是运行在本地框192.168.1.3上的应用程序的一部分,并试图连接到远程服务器192.168.1.4。我检查了一下本地地址和远程地址是否正确。我可以双向切换(从本地到远程,从远程到本地)。
我尝试过本地端口,而不是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有效。是的,我百分之百肯定192.168.1.3是正确的本地知识产权。
编辑3:对!一时兴起,我在家里的PC上试用了这个测试应用程序,它运行得很好。因此,至少代码是有效的,问题必须与我的工作PC有关。
发布于 2013-02-18 21:00:00
好吧,原来“claptrap”是对的。
我已经禁用了防火墙,但我不知道,我们的IT部门还有其他一些防火墙--紧密集成到企业病毒扫描器中(我无法卸载或禁用)。一旦我设法让it暂时禁用它,一切都如期而至。
发布于 2013-02-12 11:04:22
调用API函数时始终检查错误代码,例如:
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;
int ret = getaddrinfo("192.168.1.3", "0", &localhints, &localaddr);
if (ret == 0)
{
ret = bind(s, localaddr->ai_addr, localaddr->ai_addrlen);
freeaddrinfo(localaddr);
if (ret == 0)
{
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;
ret = getaddrinfo("192.168.1.4", "12345", &remotehints, &remoteaddr);
if (ret == 0)
{
ret = connect(s, remoteaddr->ai_addr, remoteaddr->ai_addrlen);
freeaddrinfo(remoteaddr);
if (ret == 0)
{
// connect succeeded...
// can use getsockname() here to discover which port was actually bound to, if needed.
// On some OS versions, bind() does not perform the actual binding immediately,
// connect() does the actual binding instead since it can make more informed choices based on the target address being connected to...
}
else
{
// connect failed...
}
}
else
{
// getaddrinfo() failed
}
}
else
{
// bind failed
}
}
else
{
// getaddrinfo() failed...
}代码到底能达到多远?
https://stackoverflow.com/questions/14823635
复制相似问题