c - 听(): invalid argument

标签 c sockets network-programming

尝试创建服务器-客户端应用程序时,我在设置服务器端连接时遇到了一些麻烦。设置套接字并bind()ing 套接字后,我的listen() 调用失败并显示错误消息

listen: Invalid argument

这是我从 perror() 得到的 - 在 listen() 返回 -1 的情况下。

程序的概要如下:我使用 getaddrinfo() 生成一个 struct addrinfo 的链表,循环遍历直到找到一个我可以成功地创建一个套接字,然后是 bind(),最后是 listen()

listen() 调用如下:

if ((status = listen(socket_fd, BACKLOG_SIZE)) == -1) {
    perror("listen");
    close(socket_fd);
    freeaddrinfo(res);
    exit(EXIT_FAILURE);
}

可以肯定的是,我打印了 socket_fdBACKLOG_SIZE 的值,结果是 35,分别。现在已经调试了几个小时,我根本找不到问题所在。也没有在 stackOverflow 上发现任何人有同样的问题......

提前感谢您的帮助!

完整程序:

int main(int argc, char* argv[]) {
    int port_no = server_usage(argc, argv);
    ready_connection(port_no);

    /* Synopsis:
    getaddrinfo()
    socket()
    bind()
    listen()
    accept()
    */
    int socket_fd = setup_socket(NULL, port_no);

    struct sockaddr_storage their_addr;
    socklen_t addr_size = sizeof(their_addr);
    int new_fd = 0;

    // Allow reuse of sockets
    int activate=1;
    setsockopt(socket_fd, IPPROTO_TCP, TCP_NODELAY, &activate,     sizeof(int));

    if ((status = bind(socket_fd, res->ai_addr, res->ai_addrlen)) == -1) {
        perror("bind");
        exit(EXIT_FAILURE);
    }

    if ((status = connect(socket_fd, res->ai_addr, res->ai_addrlen)) == -1) {
        perror("connect");
        close(socket_fd);
        freeaddrinfo(res); // free the linked-list
        exit(EXIT_FAILURE);
    }

    if ((status = listen(socket_fd, BACKLOG_SIZE)) == -1) {
        perror("listen");
        close(socket_fd);
        freeaddrinfo(res); // free the linked-list
        exit(EXIT_FAILURE);
    }

    if ((new_fd == accept(socket_fd, (struct sockaddr *)&their_addr, &addr_size)) == -1) {
        perror("accept");
        exit(EXIT_FAILURE);
    }

    char buffer[BUFSIZE];
    recv(new_fd, buffer, BUFSIZE, 0);

    close(socket_fd);
    close(new_fd);
    freeaddrinfo(res); // free the linked-list

    return 0;
}

setup_socket()-函数:

int setup_socket(char* hostname, int port_no) {
    // hints is mask struct, p is loop variable
    struct addrinfo hints, *p;

    memset(&hints, 0, sizeof hints); // make sure the struct is empty
    // TODO IPv6-support?
    hints.ai_family = AF_INET;     // only IPv4 supported
    hints.ai_socktype = SOCK_STREAM; // TCP stream sockets
    hints.ai_flags = AI_PASSIVE;     // fill in my IP for me

    char port_str[6]; // max port size is 5 digits + 0-byte
    memset(port_str, 0, 6);
    sprintf(port_str, "%d", port_no);

    if ((status = getaddrinfo(hostname, port_str, &hints, &res)) == -1) {
        fprintf(stderr, "getaddrinfo error: %s\n", gai_strerror(status));
        exit(EXIT_FAILURE);
    }

    int socket_fd = 0;

    for (p = res; p != NULL; p = p->ai_next) {
        if ((socket_fd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) {
            perror("socket");
            exit(EXIT_FAILURE);
        }
    }

    if (socket_fd == 0) {
        errno = ENOTSOCK;
        perror("no socket");
        exit(EXIT_FAILURE);
    }

    return socket_fd;
}

最佳答案

您不能在同一个套接字上先连接(),然后再监听()。丢失 connect()。

关于c - 听(): invalid argument,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33845491/

相关文章:

c - 在AVR studio中将温度转换为电压

java - Android : Socket - java.net.SocketException: sendto 失败: EPIPE (Broken pipe)

C Unix套接字编程,确保读/写字节数?

windows - 在软件中测试网络中断

c - C中的for循环输出

c - 文本文件撇号麻烦

c - 使用 pthread 互斥锁锁定关键区域?

python - 如何在 Python 中使用同一个端口两次

c - 如何在 Linux 和 Mac OSx 中获得更高级的网络接口(interface)卡类型

c - sendto()函数中发送一个结构体——C语言