Вопрос программистам под UNIX
if (stat < 0) {А где же return после ошибки?
printf("class icmp_sock: select error\n");
};
И ещё на errno==EINTR неплохо бы проверить.
> почему если не использовать select а сразу считывать, а в s нет данных, то пограмма подвисает на read?
потому что O_NONBLOCK не поставил с помощью fcntl(2)
> И второй вопрос: как кроме select можно узнать есть ли данные в s или нет (select мне не подходит своим таймаутом - минимальное время вызова select в Free BSD если в s не появились
> данные 10 мс)
poll(2) с нулевым таймаутом
а то и сразу read(2 если ситуация позволяет
Если FreeBSD, то kevent.
Спасибо, вроде разобрался.
а в kv.data в случае сокета будет сколько там приехало. мелочь, а приятно - не надо делать лишних read'ов. вообще, kqueue рулит
А как можно очистить сокет от всех пакетов в нем, не считывая их из него?
Зачем чистить буфер от пакетов?
Наверное, проще всего переоткрыть сокет.
Отчего такое желание возникает? Не могу представить ситуации когда такое нужно делать.
Есть такая ситуация
Может быть есть какое-то другое решение? Расскажи ситуацию если не секрет.
Программа аналогичная пингу. В сеть посылаются пакеты, когда сеанс измерения закончен в сокете еще будет находиться энное количество пакетов. После необходимо его очистить и провести новый сеанс.
Всё-таки ты что-то не так делаешь. А что именно, по такому короткому описанию не понять.
Ну что же не понятно? Измерения окончены, а пакеты из сети продолжают еще приходить (но они мне уже не нужны). Так вот их и нужно удалить из сокета перед следующим сеансом.
Реально закрыть и открыть новый для следующего сеанса будет лучше.
Проблема мне кажется не принципиальной - может ведь прийти и после начала следующего сеанса, тогда всё равно читать придётся, и отделять от "правильных" пакетов. А может ещё просто "шум" какой-нибудь свалиться, в этом ихнем интернете всякое бывает.
Оставить комментарий
Dimic-rok
В функции выполняется следующий код:FD_ZERO(&readFds);
FD_SET(s, &readFds);
int stat=select(FD_SETSIZE, &readFds, NULL, NULL, &time);
if (stat < 0) {
printf("class icmp_sock: select error\n");
};
if (stat == 0) return 0;
stat=read(s,p->data,IP_MAXPACKET);
Все работает замечательно, если в s есть данные мы их читаем, если нет, то выходим. Вопрос: почему если не использовать select а сразу считывать, а в s нет данных, то пограмма подвисает на read? по идее read в этом случае должна вернуть 0. И второй вопрос: как кроме select можно узнать есть ли данные в s или нет (select мне не подходит своим таймаутом - минимальное время вызова select в Free BSD если в s не появились данные 10 мс)