首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在WSAEADDRNOTAVAIL中连接结果之前的WinSock绑定-请求的地址在其上下文中无效

在WSAEADDRNOTAVAIL中连接结果之前的WinSock绑定-请求的地址在其上下文中无效
EN

Stack Overflow用户
提问于 2013-02-12 00:40:51
回答 2查看 2.7K关注 0票数 2

我需要使用WinSock从特定的本地网卡打开一个套接字。我问了这个问题,得到了一个答案,here。简而言之,答案建议您首先绑定到本地接口,然后调用connect。

但是,当我这样做时,我会得到一个WSAEADDRNOTAVAIL (10049)“所请求的地址在其上下文中无效”。为什么会这样呢?

假设下面的示例代码是运行在本地框192.168.1.3上的应用程序的一部分,并试图连接到远程服务器192.168.1.4。我检查了一下本地地址和远程地址是否正确。我可以双向切换(从本地到远程,从远程到本地)。

我尝试过本地端口,而不是0;没有区别。如果在连接之前删除绑定,那么它就能工作,但是我无法指定网络接口。

所以,你知道我为什么一直拿着WSAEADDRNOTAVAIL吗?

代码语言:javascript
复制
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有关。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-18 21:00:00

好吧,原来“claptrap”是对的。

我已经禁用了防火墙,但我不知道,我们的IT部门还有其他一些防火墙--紧密集成到企业病毒扫描器中(我无法卸载或禁用)。一旦我设法让it暂时禁用它,一切都如期而至。

票数 2
EN

Stack Overflow用户

发布于 2013-02-12 11:04:22

调用API函数时始终检查错误代码,例如:

代码语言:javascript
复制
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...
}

代码到底能达到多远?

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14823635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档