Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > epoll - переполнение буфера


Автор: Anton Vatchenko 24.5.2011, 09:28
У меня есть код сервера, который был вытащен из примеров по epoll, Вроде все тривиально, если учитывать подсоединение клиентов, чтение данных от них, все неблокирующее, в одном потоке. Но по поводу записи в сокет (write) возникла проблема. До недавнего времени данные писались постепенно, и не возникало проблем с переполнением буфера для записи. Но вдруг начали теряться куски пакетов. Я начал отправлять пакеты по 4 кб, а write возвращает, что он не весь записан, либо вообще -1, и EAGAIN. Что делать в таких ситуациях?

Автор: boostcoder 24.5.2011, 09:37
при неблокирующих операциях, EAGAIN - обычное явление.
что делать? - читать ман(man 2 write).

Автор: boostcoder 24.5.2011, 09:56
вот только непонятно, откуда взято мнение о переполнении буфера? и какого буфера?

Автор: Anton Vatchenko 24.5.2011, 11:27
Везде мануалы по еполу какие-то бедные, для новичков, не описаны серьезные вещи, поэтому ман write ничего не дал...

Мнение взялось потому, что раньше кидал в сокет по 20-50 байт, раз в секунду, они уходили, сейчас пишу по несколько килобайт сразу, и либо write(..., n) < n, либо -1 и eagain. Насколько я понимаю, решение следующее - то что не записалось, надо кинуть в очередь, и записать потом. Есть ли системная очередь, или необходимо самому это разруливать? Если самому, то потом как узнать, что дескриптор "разгрузился"?

Я понимаю, что это довольно адекватная ситуация, как и SIGPIPE при обрыве связи, но ведь надо уметь обрабатывать ее... Я в свое время пол интернета облазил только чтобы мое приложение не слетало по SIGPIPE - мануал тут умалчивал, и помогли народные умельцы.

Автор: boostcoder 24.5.2011, 11:30
Цитата(Anton Vatchenko @  24.5.2011,  11:27 Найти цитируемый пост)
Везде мануалы по еполу какие-то бедные, для новичков, не описаны серьезные вещи, поэтому ман write ничего не дал

а epoll тут не при чем.

в http://www.google.ru/#sclient=psy&hl=ru&newwindow=1&source=hp&q=non-blocking+io+EAGAIN+write&aq=f&aqi=&aql=&oq=&pbx=1&fp=6bfc9cea7cddb9cb полно описаний и решений подобной проблемы. читайте.

Автор: Anton Vatchenko 24.5.2011, 11:32
epoll при том, что раньше используя select и просто блокирующие сокеты, проблем не было, даже когда пихал сразу несколько мегабайт. Меня бы удивило то, что в линуксе блокирующие сокеты как-то сами поддерживают очередь отправки, а в неблокирующих надо ручками кидать куски когда дескриптор соизволит не вернуть -1 при write.

Автор: MAKCim 24.5.2011, 11:35
Цитата(Anton Vatchenko @  24.5.2011,  11:32 Найти цитируемый пост)
epoll при том, что раньше используя select и просто блокирующие сокеты, проблем не было, даже когда пихал сразу несколько мегабайт. Меня бы удивило то, что в линуксе блокирующие сокеты как-то сами поддерживают очередь отправки, а в неблокирующих надо ручками кидать куски когда дескриптор соизволит не вернуть -1 при write. 

раньше оно, видимо, отправлялось быстро, поэтому задержек не было "видно"

Автор: Anton Vatchenko 24.5.2011, 13:09
Не буду спорить, большим специалистом не являюсь. Как эту проблему решить?

Автор: boostcoder 24.5.2011, 13:18
http://www.google.ru/#sclient=psy&hl=ru&newwindow=1&source=hp&q=non-blocking+io+EAGAIN+write&aq=f&aqi=&aql=&oq=&pbx=1&fp=6bfc9cea7cddb9cb

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)