c - 未收到后续消息

标签 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;
}

最佳答案

在每次选择之后你需要调用FD_ZERO(&read_set); FD_SET(newfd, &read_set); 再次。

因此,只需将这些函数移动到循环中,在 select 之前。

关于c - 未收到后续消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20253885/

相关文章:

c++ - eclipse CDT : doesn't show name a macro appears in

c - 如果 typedef 是存储类,则 typedef 的范围和生命周期是多少?

C 链表 : How do I save the 'Head' in a 'Temp' var so I don't have to traverse backwards each time

python - 在 Python 版本之间通过套接字发送 numpy 数组,ascii 错误

windows - 套接字 : Client was disconnected or not?

c - C 中工厂方法的参数

python - TypeError 参数必须是 int 或具有 fileno() 方法

linux - net.unix.max_dgram_qlen 问题

linux上的C网络服务器编程

javascript - Node.js 请求模块获取现代版本的网站