#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()
это также чтение из сокета…