2010-02-19 2 views
1

Я сделал функцию отправки UDP-пакета на сервер и получения возвращенных пакетов. Когда я делаю один вызов recvfrom, он работает, но мне нужно получить все потенциальные пакеты с сервера в течение определенного таймаута.Как получить несколько UDP-пакетов в C?

Вот мой код: http://pastebin.be/23548

Может кто-нибудь мне помочь? Спасибо.

ответ

1

Параметр SO_RCVTIMEO, который вы установили в сокет, фактически является таймером бездействия. Другими словами, устанавливая RCVTIMEO, вы гарантируете, что вызов recvfrom вернется после истечения таймера, даже если данные не были получены. Не похоже, что это именно то, что вы пытаетесь сделать.

Существует несколько способов сделать то, что вы просите ... вот несколько идей.

Если вам удобны сигналы, вы можете использовать 'setitimer' для отслеживания максимального таймаута. http://linux.die.net/man/2/setitimer

Он отправит ваш процесс SIGALRM по истечении срока действия таймера, а в вашем обработчике сигнала вы можете установить флаг, который сообщает вашему циклу recvfrom для выхода.

Вы также можете взять системное время в начальной точке и затем опросить его в своем цикле recvfrom, чтобы узнать, прошло ли вы заданное значение таймаута. http://dell5.ma.utexas.edu/cgi-bin/man-cgi?gettimeofday+2

+0

Спасибо за ответ? У меня есть еще вопрос, прежде чем продолжить ... Я удалил функцию fcntl(), и теперь она снова работает, так как есть также тайм-аут. Но теперь каждый ответ занимает 500 мс, что не было при вызове recvfrom один раз. Почему он ведет себя так? Shoulndtt это остановить цикл, как только нет данных, полученных от recvfrom? Похоже, что теперь он возвращается только после истечения тайм-аута ... – 2010-02-19 10:06:10

+0

Recvfrom - это блокирующий вызов. Поэтому, если пакетов нет, и вы не установили SO_RCVTIMEO (или O_NONBLOCK), он будет блокироваться навсегда. Я предполагаю, что вы взяли сигнальный маршрут, что вызовет вызов recvfrom, чтобы прервать его по истечении срока действия таймера. – sckor

Смежные вопросы