recv не получает все сообщения - PullRequest
2 голосов
/ 24 апреля 2020

мой сервер только отображает первое сообщение о любых новых клиентах, но не отправляет другое сообщение, вот код:

void init_serv(serv_t *serv)
{
    int i = 0;

    serv->ret = poll(serv->fds, serv->nfds, 0);
    if (serv->ret < 0)
    {
      perror("poll() failed");
      return;
    }
    serv->current_size = serv->nfds;
    for (i = 0; i < serv->current_size; i++) {
        if(serv->fds[i].revents == 0)
          continue;
        if(serv->fds[i].revents != POLLIN) {
            printf("Error! revents = %d\n", serv->fds[i].revents);
            serv->end_server = 1;
            break;
        }
        if (serv->fds[i].fd == serv->sockfd) {
            do {
                serv->newfd = accept(serv->sockfd, NULL, NULL);
                if (serv->newfd < 0) {
                    if (errno != EWOULDBLOCK) {
                        perror("  accept() failed");
                        serv->end_server = 1;
                    }
                    break;
                }
                serv->fds[serv->nfds].fd = serv->newfd;
                serv->fds[serv->nfds].events = POLLIN;
                serv->nfds++;
            } while (0);
        } else {
            serv->close_conn = 1;
            do {
                serv->ret = recv(serv->fds[i].fd, serv->buffer, sizeof(serv->buffer), 0);
                printf("Buffer = %s\n", serv->buffer);
                bzero(serv->buffer, sizeof(serv->buffer));
                if (serv->ret < 0) {
                    if (errno != EWOULDBLOCK) {
                        perror("recv() failed");
                        serv->close_conn = 1;
                    }
                    break;
                }
                if (serv->ret == 0) {
                    printf("Connection closed\n");
                    serv->close_conn = 1;
                    break;
                }
            } while (1);
            if (serv->close_conn) {
                close(serv->fds[i].fd);
                serv->fds[i].fd = -1;
            }
        }
        serv->fds[i].revents = 0;
    }
}

Я думаю, что проблема с recv, но как я могу исправить это, чтобы получать все сообщения от всех клиентов? если я поставлю recv в al oop while (1), я получу все сообщения, но только от первого клиента, подключенного к серверу, и получу другое сообщение, только если я прерву l oop .. .

...