如何解决'无法分配请求的地址?'

时间:2016-07-18 15:57:54

标签: c++ sockets udp ip bind

netstat -a -n.确认IP地址和端口都没有被使用当我在调用bind的方法中使用gdb和break时,我看到正在使用正确的IP地址和端口以及合理的套接字地址长度16.这是一个UDP侦听器。远程IP是静态的,并从配置文件中读取。

这是代码,

void CSocket::Bind(IpEndPoint& endPoint)
{
    int bindResult = bind( socketHandle, endPoint.GetSockAddrPtr(), 
        endPoint.GetAddrLength());
    if(bindResult < 0)
    {
        TRACE_ERROR("Failed to bind to socket. %s. IpAddress %s Port %d AddrLength %d",
            strerror(errno), endPoint.GetIpAddressString(), 
            ntohs(endPoint.GetPort()), endPoint.GetAddrLength());

这是来自gdb,

  

断点1,CSocket :: Bind(这= 0x819fa24,ipAddress =&#34; 192.0.2.77&#34;,   port = 4185)在Socket.cpp:126

这是上面代码中的TRACE_ERROR

  

错误:无法绑定到套接字。 errno 99(无法分配请求的地址)。   IpAddress 192.0.2.77 Port 4185 AddrLength 16

我一直在重读Beej's Guide to Network Programming,但没有找到线索。这是UDP,因此不需要绑定连接。防火墙已关闭。我还应该在哪儿看?

1 个答案:

答案 0 :(得分:1)

关于@Aconcagua所说的内容:你想要绑定一个本地地址(不是那个“未使用”的地址)。你不能只是组成一个本地地址。您可以使用INADDR_ANY绑定到任何地址,或者需要绑定分配给其中一个本地接口的地址。这可能是问题所在。 (bind设置本地地址,connect设置远程地址 - 或者,使用UDP,您可以使用sendto指定每个数据包的远程地址。) - Gil Hamilton