选择监听套接字总是成功

select listen socket always succeeds

本文关键字:成功 套接字 监听 选择      更新时间:2023-10-16

我正在做一个玩具服务器-客户端项目(在linux上),其中多个客户端连接到服务器并在服务器上进行远程执行。我所拥有的是一个select()调用,它应该告诉我套接字何时可读。这是为了倾听和接受新的联系。下面我发布了一个片段。

int main() {
    int sockfd;
    fd_set readfds;
    struct sockaddr_in serv_addr,cli_addr;
    struct timeval tv;
    socklen_t clilen = sizeof(cli_addr); 
    sockfd=socket(AF_INET, SOCK_STREAM, 0);
    //setsockopt(sockid,IPPROTO_IPV6,IPV6_V6ONLY,(char *)&yes,sizeof(yes));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr =inet_addr("127.0.0.1");// INADDR_ANY;
    serv_addr.sin_port = htons(40000);
    if (bind(sockfd, (struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) 
    {
        perror("bind");
    }
    while(1)
    {
        FD_ZERO(&readfds);
        FD_SET(sockfd,&readfds);
        tv.tv_sec=2;
        tv.tv_usec=500000;
        int result =select(sockfd+1,&readfds,NULL,NULL,&tv);
        if(result<0) {
            exit(-1);
        }
        else if(result>0) {
            if(FD_ISSET(sockfd,&readfds)) {
                //int newsockfd =accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
                int newsockfd =accept(sockfd,NULL,NULL);
                if(newsockfd<0) {
                    perror("accept");
                }
            }
        }
    }

    return 0;
}

但是上面代码中的select总是成功的,不管客户端是否存在,accept抛出错误:"accept: Invalid argument"继续循环,选择甚至不等待超时。有人可以解释什么是问题与我的代码。我没有使用select正确的方式,它应该被使用(我是第一次使用它)?

您忘记在bind之后调用listen