LINUX.ORG.RU

select && recv


0

0

серевер работает таким образом:
в цикле вызываем select и если что-то есть вызываем recv,

вопрос,
если при вызове recv мы скопировали не все данные
которые есть в буфере ОС,
то при следующем вызове select
мы опять получим сообщение о том что что-то есть?

anonymous

Какой сервер? О чём вообще идёт речь? Попросил бы точнее формулировать вопросы... ;-))

MiracleMan ★★★★★
()
Ответ на: комментарий от MiracleMan

>Какой сервер? О чём вообще идёт речь?

перечитай еще раз, по-моему все вполне ясно сформулировано.

anonymous
()

каркас кода

for (;;) {
char buf[1024];
int changed_sockets=select(...);
for (int i=0; i<change_sockets; i++)
recv(fd[i], buf, sizeof(buf), ..);
}

вопрос заключается в том что если recv скопирует в буфер не все данные которые прислали - что-то осталось в буфере ОС,
и допустим больше никто ничего не прислала, будет ли select сигнализировать
о том что состояние буфера изменилось?

т.е. в данной схеме обработаются все присланные данные, даже если их размер больше 1024 или нет?

anonymous
()

да, забыл сказать используется протокол - TCP

anonymous
()
Ответ на: комментарий от anonymous

> вопрос заключается в том что если recv скопирует в буфер не все данные которые прислали - что-то осталось в буфере ОС, и допустим больше никто ничего не прислала, будет ли select сигнализировать о том что состояние буфера изменилось?

да, будет.

// wbr

klalafuda ★☆☆
()

> если при вызове recv мы скопировали не все данные которые есть в буфере ОС, то при следующем вызове select мы опять получим сообщение о том что что-то есть?

Для начала man select. Там говорится, что select вернет отметку для дескриптора в readfds, если если указатель не находится в конце файла, то есть если в буфере есть хотя-бы один байт - это уже признак того, что можно читать и основание для завершения ожидания select'а.

no-dashi ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.