дескриптор исключения epoll - PullRequest
1 голос
/ 21 июня 2011

Я работаю над сетевым программированием с использованием epoll.Мне было интересно, что сервер не получил все данные клиента отправлено.Например, если клиент отправил 100 байтов, а сервер каким-то образом получил только 94 байта.Как мне справиться с этим делом?

Заранее спасибо ..

1 Ответ

3 голосов
/ 21 июня 2011

Сигнал epoll готовность , он не дает никаких гарантий относительно количества данных.EPOLLIN дает вам только гарантию того, что следующая операция чтения в дескрипторе не будет блокирована и будет по крайней мере читать 1 байт.
Поскольку обычно дескрипторы не блокируются по ряду (частично специфических для os) причин,обычная идиома - читать, пока не вернутся EAGAIN.Если это меньше данных, чем ожидалось (например, если у вас есть сообщение с заголовком «мой размер составляет 100 байт»), тогда вы будете ждать следующего EPOLLIN (или EPOLLHUP) и повторять (или прерывать).

Для TCP получение меньшего количества данных, чем ожидалось, является абсолютно нормальным условием.Повторите.

С UDP, если вы не предоставите слишком маленький буфер (это отбросит остаток!), Этого не произойдет.Никогда, никогда.UDP доставляет всю дейтаграмму за раз или ничего.Частичных поставок нет.Если происходит фрагментация IP, UDP соберет все фрагменты в одну дейтаграмму и доставит целую дейтаграмму.Если фрагмент был потерян, UDP ничего не доставит.

...