未收到后续消息

时间:2013-11-27 21:58:15

标签: c sockets network-programming

我正在开展一个网络项目。我可以成功地将客户端程序中的单个消息发送到我的服务器程序。但是,当我发送第二条消息时,服务器显然没有收到它。我这样说是因为客户端程序生成输出以表明消息已发送,但服务器根本没有反应。

我认为我对select()FD_ISSET()做错了。谁能看到我做错了什么?感谢。

int main(int argc, char *argv[]) {

    int sockfd, newfd;

    struct sockaddr_in clientAddr;
    unsigned int recvLen;
    socklen_t addr_size = sizeof clientAddr;

    fd_set read_set;
    struct timeval tv;

    char buffer[BUFFSIZE];

    // prepare the address struct for the first client
    bzero(&clientAddr,sizeof(clientAddr));                          //zero the struct
    clientAddr.sin_family = AF_INET;                              //address family (ipv4)
    clientAddr.sin_port = htons(SERVER_PORT);  //sets port to network byte order
    clientAddr.sin_addr.s_addr = INADDR_ANY;

    // create a listening connection to listen for requests from clients
    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        fprintf(stdout, "Cannot create socket for client 0.\n");
        fprintf(stdout, "Terminating program\n\n");
        exit(1);
    }

    if (bind(sockfd, (struct sockaddr *)&clientAddr, sizeof(clientAddr)) < 0) {
        fprintf (stdout, "Binding failed for client 0\n\n");
        perror("bind failed");
        exit (1);
    }

    if (listen(sockfd, 10) < 0) {
        fprintf (stdout, "Listen() failed\n");
        perror("listen() failed");
        exit (1);
    }

    // accept the connection
    if ((newfd = accept(sockfd, (struct sockaddr *)&clientAddr, &addr_size)) < 0) {
        fprintf(stdout, "Error accepting inbound data from client 0\n");
        perror(" accept() failed");
        exit(EXIT_FAILURE);
    }

    // initialize the fd set
    FD_ZERO(&read_set);
    FD_SET(newfd, &read_set);       // adding our socket to the set
    tv.tv_sec = 0;
    tv.tv_usec = TIMEOUT * 1000;

    while (1) {

        if ( select(newfd+1, &read_set, NULL, NULL, &tv) == -1) {
            perror("select failure");
            fprintf(stdout, "errno: %d\n", errno);
            exit(EXIT_FAILURE);
        }

        if (FD_ISSET(newfd, &read_set)) {
            bzero(buffer, BUFFSIZE);
            recv(newfd, &buffer, BUFFSIZE, 0);

            fprintf(stdout, "Received message: %s\n", buffer);
        }

    }

    return 0;
}

1 个答案:

答案 0 :(得分:1)

每次select后,您需要再次致电FD_ZERO(&read_set); FD_SET(newfd, &read_set);

所以在select之前将这些函数移到循环中。