如何使用select和accept正确地与客户沟通?

如何使用select和accept正确地与客户沟通?,c,sockets,C,Sockets,我已经阅读了一些关于选择和接受的示例和手册,但我仍然不知道哪里做错了 我尝试让服务器与多个客户端通信。但当我先执行server,然后执行client时,server将立即导致分段错误(当server.c中的I==sockfd时)。我试着打印一些字符串来检查哪个语句会导致错误,如果(I==sockfd),它甚至不会在之后打印任何内容。所以我真的不知道如何继续前进,有什么建议吗 服务器.c char inputBuffer[140] = {}; char message[] = {"

我已经阅读了一些关于
选择
接受
的示例和手册,但我仍然不知道哪里做错了

我尝试让服务器与多个客户端通信。但当我先执行server,然后执行client时,server将立即导致分段错误(当server.c中的
I==sockfd
时)。我试着打印一些字符串来检查哪个语句会导致错误,如果(I==sockfd),它甚至不会在
之后打印任何内容。所以我真的不知道如何继续前进,有什么建议吗

服务器.c

    char inputBuffer[140] = {};
    char message[] = {"Hi,this is server.\n"};
    int sockfd = 0,forClientSockfd = 0;
    sockfd = socket(AF_INET, SOCK_STREAM, 0);

    if (sockfd == -1)
    {
        printf("Fail to create a socket.");
    }

    //socket creation
    struct sockaddr_in serverInfo,clientInfo;
    socklen_t addrlen = sizeof(clientInfo);
    serverInfo.sin_family = PF_INET;
    serverInfo.sin_addr.s_addr = INADDR_ANY;
    serverInfo.sin_port = htons(PORT);
    bind(sockfd,(struct sockaddr *)&serverInfo,sizeof(serverInfo));
    listen(sockfd,5);
    fd_set active_fd_set, read_fd_set;
    int i;
    struct sockaddr_in clientname;
    size_t size;

    /* Initialize the set of active sockets. */
    FD_ZERO (&active_fd_set);
    FD_SET (sockfd, &active_fd_set);
    int fd_max = sockfd;
    while (1)
    {
        /* Block until input arrives on one or more active sockets. */
        //FD_ZERO (&active_fd_set);
        //FD_SET (sockfd, &active_fd_set);
        read_fd_set = active_fd_set;
        if (select (fd_max+1, &read_fd_set, NULL, NULL, NULL) < 0)
        {
            printf("select fail\n");
        }

        /* Service all the sockets with input pending. */
        for (i = 0; i <= fd_max; ++i)
        {
            //printf("%d\n",i);
            if (FD_ISSET (i, &read_fd_set))
            {
                //printf("inner :%d %d\n",i,sockfd);
                if (i == sockfd)
                {
                    /* Connection request on original socket. */
                    //printf("A");
                    int new;
                    size = sizeof (clientname);
                    new = accept (sockfd,(struct sockaddr *) &clientname,&size);

                    if (new < 0)
                    {
                        printf("accept fail\n");
                    }
                    else
                    {
                        printf (
                            "Server: connect from host %s, port %hd.\n",
                            inet_ntoa (clientname.sin_addr),
                            ntohs (clientname.sin_port));
                        FD_SET (new, &active_fd_set);
                        if(new > fd_max)
                        {
                            fd_max = new;
                        }
                    }
                }
                else
                {
                    /* Data arriving on an already-connected socket. */
                    if (read_from_client (i) < 0)
                    {
                        close (i);
                        FD_CLR (i, &active_fd_set);
                    }
                }
            }
        }
    }
    return 0;
}

int read_from_client (int filedes)
{
    char buffer[140];
    int nbytes;

    nbytes = recv (filedes, buffer, sizeof(buffer),0);
    if (nbytes < 0)
    {
        /* Read error. */
        perror ("read");
        exit (EXIT_FAILURE);
    }
    else if (nbytes == 0)
        /* End-of-file. */
        return -1;
    else
    {
        /* Data read. */
        printf ("Server: got message: `%s'\n", buffer);
        return 0;
    }
}

谢谢

构建服务器程序的调试版本,运行它并使用调试器分析核心文件,以查看分段错误的确切发生位置。或者在调试器中运行服务器程序,直到出现分段错误并检查其发生位置。建议:如果检测到错误并打印出有关错误的消息。。。不要像出错的函数实际成功那样继续运行。
    int sockfd = 0;
    sockfd = socket(AF_INET, SOCK_STREAM, 0);

    if (sockfd == -1)
    {
        printf("Fail to create a socket.");
    }

    //socket connnection

    struct sockaddr_in info;
    bzero(&info,sizeof(info));
    info.sin_family = PF_INET;

    //localhost test
    info.sin_addr.s_addr = inet_addr(LOCALHOST);
    info.sin_port = htons(PORT);



    int err;
    char *p;
    //Send a message to server
    err = connect(sockfd,(struct sockaddr *)&info,sizeof(info));
    if(err==-1)
        printf("Connection error");
    while(1)
    {

        char message[140];
        char receiveMessage[140] = {};
        fgets(message,140,stdin);
        //scanf("%*[^\n]",message);
        //printf("%s",message);
        /*if(p=strchr(message,'\n')){
            *p = 0;
        }else{
            scanf("%*[^\n]");
            scanf("%c");
        }
        fgets(message,140,stdin);*/
        //scanf("%s",message);
        send(sockfd,message,sizeof(message),0);
        //printf("RCV");
        //recv(sockfd,receiveMessage,sizeof(receiveMessage),0);
        //printf("%s\n",receiveMessage);
    }