| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 - мануал тут умалчивал, и помогли народные умельцы. |
| Автор: Anton Vatchenko 24.5.2011, 11:32 |
| epoll при том, что раньше используя select и просто блокирующие сокеты, проблем не было, даже когда пихал сразу несколько мегабайт. Меня бы удивило то, что в линуксе блокирующие сокеты как-то сами поддерживают очередь отправки, а в неблокирующих надо ручками кидать куски когда дескриптор соизволит не вернуть -1 при write. |
| Автор: MAKCim 24.5.2011, 11:35 | ||
раньше оно, видимо, отправлялось быстро, поэтому задержек не было "видно" |
| Автор: 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 |