Опция 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