加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

绑定失败:无法分配请求的地址

发布时间:2020-12-16 09:43:18 所属栏目:百科 来源:网络整理
导读:我正在尝试编写一个侦听我机器上端口的C程序. 我遇到了一个奇怪的错误. 每当我尝试将套接字绑定到固定的ip(127.0.0.1或我的实际IP)时,我得到“绑定失败:无法分配请求的地址”错误. 但是,当我将INADDR_ANY作为要绑定的地址传递给bind时,它可以正常工作. 这是
我正在尝试编写一个侦听我机器上端口的C程序.
我遇到了一个奇怪的错误.

每当我尝试将套接字绑定到固定的ip(127.0.0.1或我的实际IP)时,我得到“绑定失败:无法分配请求的地址”错误.
但是,当我将INADDR_ANY作为要绑定的地址传递给bind时,它可以正常工作.

这是我拥有的唯一两个IP,所以不能因为我可用的其他IP地址而使0.0.0.0正常工作.

这是代码:

#include<sys/types.h>
#include<stdio.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<errno.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    int port = 1234;    /* port number */
    int rqst;       /* socket accepting the request */
    socklen_t alen;       /* length of address structure */
    struct sockaddr_in my_addr;    /* address of this service */
    struct sockaddr_in client_addr;  /* client's address */
    int sockoptval = 1;

    int svc;


    /* create a TCP/IP socket */
    if ((svc = socket(AF_INET,SOCK_STREAM,0)) < 0) {
        perror("cannot create socket");
        exit(1);
    }

    /* allow immediate reuse of the port */
    setsockopt(svc,SOL_SOCKET,SO_REUSEADDR,&sockoptval,sizeof(int));

    /* bind the socket to our source address */
    memset((char*)&my_addr,sizeof(my_addr));  /* 0 out the structure */
    my_addr.sin_family = AF_INET;   /* address family */
    my_addr.sin_port = htons(port);
    //my_addr.sin_addr.s_addr = htonl(INADDR_ANY); /* Works! */
    my_addr.sin_addr.s_addr = htonl(inet_addr("127.0.0.1")); /* Fails! */

    if (bind(svc,(struct sockaddr *)&my_addr,sizeof(my_addr)) < 0) {
        perror("bind failed");
        exit(1);
    }

    printf("Listening on %dn",my_addr.sin_addr.s_addr);
    /* set the socket for listening (queue backlog of 5) */
    if (listen(svc,5) < 0) {
        perror("listen failed");
        exit(1);
    }

    /* loop,accepting connection requests */
    for (;;) {
        while ((rqst = accept(svc,(struct sockaddr *)&client_addr,&alen)) < 0) {
            /* we may break out of accept if the system call */
                        /* was interrupted. In this case,loop back and */
                        /* try again */
                        if ((errno != ECHILD) && (errno != ERESTART) && (errno != EINTR)) {
                                perror("accept failed");
                                exit(1);
                        }
                }
        /* the socket for this accepted connection is rqst */
    }
}

解决方法

函数inet_addr返回网络顺序中的地址:

The inet_addr() function converts the Internet host address cp from
IPv4 numbers-and-dots notation into binary data in network byte order

所以放弃了htonl.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读