绑定套接字请求给出 EADDRNOTAVAIL

A bind socket request gives a EADDRNOTAVAIL

我有一个小的 C 程序,我试图在某个 ip:port 处绑定到一个套接字。这是程序 -

int main ()
{
    int udp_fd = -1;
    struct sockaddr_in sockaddr;

    char *ip = (char *)"xx.yyy.zzz.aaa";
    int port = 1234;
    udp_fd = socket(AF_INET, SOCK_DGRAM, 0);

    if (udp_fd == -1) {
       printf("Could not create socket\n");
       return -1;
    }

    sockaddr.sin_family = AF_INET;
    sockaddr.sin_addr.s_addr = inet_addr(ip);
    sockaddr.sin_port = htons(port);

    if (bind(udp_fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr)) == -1) {
        printf("Could not bind to %s: %d: %d: %d\n", ip, port, errno, udp_fd);
        return -1;
    }

    if (fcntl(udp_fd, F_SETFL, O_NONBLOCK | O_ASYNC) < 0) {
        printf("Error setting socket as non-blocking \n");
        return -1;
    }

    return 0;
}

这失败了 EADDRNOTAVAIL

define EADDRNOTAVAIL 99 /* 无法分配请求的地址 */

我尝试从与绑定失败的另一台设备位于同一网络的另一台设备连接到同一台服务器,但成功了。

故障设备上没有启用防火墙。

您正在尝试将套接字绑定到非本地 IP 地址。

您通常根本不需要绑定到特定的 IP 地址。变化:

sockaddr.sin_addr.s_addr = inet_addr(ip);

sockaddr.sin_addr.s_addr = INADDR_ANY;