вторник, 29 ноября 2016 г.

Простой echo сервер на libev

В одном из своих проектов я активно использую поллинг при помощи epoll(7). Проект этот - HTTP(s) прокси с довольно развесистой бизнес логикой. В приложении постоянно приходится менять маску событий, а так же одновременно обрабатывать довольно большое количество сетевых соединений.

Когда проект начинался, всю обвязку вокруг epoll мы сделали сами, ну и разумеется вдоволь прошлись по граблям. За пример, при разработке, я брал тоже прокси, написанное как раз с целью понять как обрабатывать большое количество соединений в однопоточном приложении и при этом не утонуть в "code spaghetti". Ссылочка на этот проект: https://github.com/gpjt/rsp

Ссылку на свой проект дать не могу - код проприетарный.

Когда все более-менее влетело, я начал смотреть по сторонам на предмет "а нельзя ли немного упростить код". И разумеется код упростить можно было, используя что-то типа libevent или libev. Обе эти библиотеки предоставляют API для портируемой работы с событиями и избавляют от необходимости самому писать event-loop.
libevent, насколько я понял, по-старше будет, но на данный момент не развивается, поэтому ее я оставил на потом и решил написать небольшой примерчик использую libev.

Итак...

пятница, 18 ноября 2016 г.

GDB & SIGPIPE


При отладке сетевых приложений в GDB иногда возникает ситуация когда GDB останавливает приложение перехватывая сигнал SIGPIPE, что является для него нормальным поведением.
У себя в приложении SIGPIPE мы просто игнорируем и обычное поведение GDB для нас создает проблемы. Решается ситуация следующим образом:

handle SIGPIPE nostop noprint pass

в командной строке GDB.