Я бы, скорее всего, использовал сигналы, как в случае @ alk answer (также обсуждалось here) ,
В качестве альтернативы вы можете использовать мультиплексированный ввод-вывод.
При инициализации создайте глобальную трубу (2). Когда пришло время завершить программу, закройте конец записи - теперь считывающий конец будет мгновенно выбирать (2)/опрос (2) для чтения (для EOF). Между тем ваши потоки, связанные с recv-подключением, включают в себя конец для чтения этого канала вместе с их сокетами, например, в вызове с блокировкой выбора (2) на неопределенный срок.Если считываемый конец канала становится читаемым, потоки ввода-вывода знают, что пришло время законно прекратить работу.
Главное предостережение этого метода заключается в том, чтобы конец записи был закрыт только один раз, так как последующее наивное закрытие (2) может пресечь какой-то невинный файл, которому, по-видимому, предоставлен тот же дескриптор, что и старый написать-конец.
Проверьте возвращаемое значение 'recv' и' break', когда оно равно 0 или отрицательно? – cnicutar
Вы спрашиваете, есть ли способ сделать тайм-аут recv() после заданного интервала, если он не получит ответ? – gwilkins