Как использовать выбор между стандартным вводом и сокетом? - PullRequest
0 голосов
/ 02 июля 2019

Я пытаюсь создать чат-программу на c, основная проблема в том, что я не хочу использовать потоки, поэтому для этого мне нужно использовать select, чтобы отслеживать входящие сообщения из сокета, имоего stdin.

Я уже провел некоторый поиск того, как сделать выбор, часть сокета, кажется, в порядке, но я не могу получить stdin правильно.

    fd_set read_fds;
    FD_ZERO(&read_fds);
    FD_SET(STDIN_FILENO, &read_fds);
    FD_SET(sock_fd, &read_fds);
    while(1){
        select(sock_fd+1, &read_fds, NULL, NULL, NULL);

        if(FD_ISSET(sock_fd, &read_fds) != 0) {
          printf("Entered case for receive message\n");
          char buf[4096];
          memset(buf, 0, sizeof(buf));
          int lastBit;

          lastBit = recv(sock_fd, buf, sizeof(buf), 0);
          if (lastBit > 0 && lastBit < 4096)
          {
            buf[lastBit] = '\0';
          }
          else
          {
            close(sock_fd);
            //break;
          }
          printf("%s\n", buf);
        } else if (FD_ISSET(STDIN_FILENO, &read_fds)) {
          printf("Entered case for send message\n");
          char msg[4096];
          memset(msg, 0, sizeof(msg));
          read(0, msg, sizeof(msg));
        }
    }

При этом я ожидаю, что когда я получу новое сообщение с сервера, сообщение будет напечатано (это нормально), а когда что-то введено, код должен отправить его на мой сервер (все еще не в порядке).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...