Одновременное чтение командной строки и recvfrom в C

#c #command-line #udp

#c #командная строка #udp

Вопрос:

Чтобы создать UDP-чат, мне нужно отправить сообщение и в то же время получать сообщения. На данный момент я пытаюсь получать сообщения и, чтобы прочитать командную строку, распечатать сообщение. Более того, я хочу вызывать функцию func() каждые 10 секунд.

Это то, что я пробовал:

   fd_set readfds;
  struct timeval timeout;
  char buf[100];

  while(1){
    FD_ZERO(amp;readfds);
    FD_SET(sock_fd,amp;readfds);

    timeout.tv_sec = 10;
    timeout.tv_usec = 0;

    if(select(sock_fd  1, amp;readfds,NULL,NULL,amp;timeout) != 0){
        receiveMessages(sock_fd);
        memset((void*)buf,0,100);
        if(read(sock_fd,(void*)buf,100)!=-1){
          printf("Message : %sn", buf );
        }
    }else{
        func();
    }
 }
  

В receiveMessages() функции вызывается только одна функция: recvfrom() .

Функции receiveMessages(sock_fd) и func() корректно вызываются каждые 10 секунд, но командная строка никогда не считывается, поэтому сообщение никогда не печатается. Что я пропустил?

Комментарии:

1. Прежде всего, вы настроили сокет и связали его с sock_fd, да? Во-вторых, func() вызывается ровно каждые 10 секунд? Если я не ошибаюсь, это будет указывать select на то, что всегда возвращается из-за достижения тайм-аута … т.е. readfds Никогда не становится готовым. Что заставляет меня повторить мой первый вопрос… Вы, вероятно, хотите man socket .

2. Я связал сокет с sock_fd и да, функция func() точно вызывается через 10 секунд. Спасибо за ваш ответ.

3. Вероятно man read , вы тоже этого хотите. Подсказка: вы не всегда получаете обратно столько байтов, сколько запрашиваете.

4. Спасибо за ваш ответ, я прочитаю руководство во второй раз. Наконец, сообщение никогда не печатается, потому что «ресурс временно недоступен». Я предполагаю, что что-то не так с read().

5. read() В этом нет ничего плохого, но в вашем коде есть ряд ошибок. Начните с чтения того, что select() возвращает, FD_ISSET() , и подумайте о том, что происходит, когда read() возвращается 100. И почему вы read() вообще туда звоните, если receiveMessages() это также чтение из сокета…