Я пишу приложение C/C++ под Linux, которое считывает данные из сырого сокета (для ICMP-пакетов). Вопрос: есть ли способ отбросить все данные, которые все еще поставлены в очередь на сокет?Как удалить входящие пакеты в raw-сокете?
Проблема в том, что после сна какое-то время есть данные, стоящие в очереди на сокет, который мне неинтересен; поэтому было бы лучше всего сказать сокету «забыть все данные, которые вы забуферили прямо сейчас», так что, если я перейду в цикл select()/recvfrom(), я получаю только данные, полученные недавно.
Есть ли лучший способ, чем первый цикл опроса()/recvfrom()? Может быть, какой-то сокет API? Портативный, даже? :-)
Да, вот что я в итоге сделал ...Вместо вызова sleep() я использую select() с таймаутом, и если вызов select() указывает на входящие данные, данные принимаются с recvfrom() и игнорируются, и создается новый select(), пока сон не будет время вышло. – oliver 2008-10-22 10:14:39