如何修复 'Cannot assign requested address?'

How to fix 'Cannot assign requested address?'

确认 IP 地址和端口均未被 netstat -a -n. 使用时,当我使用 gdb 并中断调用 bind 的方法时,我看到使用了正确的 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,

Breakpoint 1, CSocket::Bind (this=0x819fa24, ipAddress="192.0.2.77", port=4185) at Socket.cpp:126

这是上面代码中的 TRACE_ERROR

ERROR: Failed to bind to socket. errno 99 (Cannot assign requested address). IpAddress 192.0.2.77 Port 4185 AddrLength 16

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

根据@Aconcagua 所说:您想绑定一个本地地址(不是 "not in use" 的地址)。你不能随便编一个本地地址。您可以使用 INADDR_ANY 绑定到任何地址,或者您需要绑定一个分配给您的本地接口之一的地址。这可能是问题所在。 (bind 设置本地地址,connect 设置远程地址——或者,对于 UDP,您可以使用 sendto 指定每个数据包的远程地址。) – Gil Hamilton