LINUX.ORG.RU

Нужна помощь с самописным вебсервером

 , , ,


0

1

Основной код https://bitbucket.org/zlofenix/temp/src

Есть общая кодобаза(куски, отвечающие за сеть - в архиве) для разных проектов, один из них - нормальный сетевой софт, в котором подключение не рвется после каждого запроса и может держаться сутками и в нем все нормально, относительно.
А есть https вебсервер, (ZS в архиве, SSLSocket и WebServerSocket) и он даже работает, не претендую на идеальный код, хотя если кто прокомментирует - буду рад, так вот - несколько дней вебсерв спокойно принимает подключения и выдает ответы, но потом, без ошибок и прочего, перестает, хром говорит ERR_CONN_RESET, а почему - отловить никак не выходит, т.к. сутки-двое работает без проблем, а все время держать valgrind - весьма затруднительно.
Кстати несколько часов гонял под валгриндом - никаких ошибок не было.
Может кто-то сможет осилить этот чудокод и увидеть где я ошибся?
В качестве либы для шифрования - polarssl 1.3.7.
1 вещь в архив забыл положить - сокет закрывается через shutdown(fd, SHUT_RDWR);close(fd);
Как всегда забыл - очень давно, на примерно таком же коде, но без SSL происходила та же фигня, т.е. маловероятно что дело в шифровании.



Последнее исправление: zlofenix (всего исправлений: 2)

Быстро посмотрев пару файликов, заметил, что ты не любишь добавлять {} там, где это не особо необходимо, например, если после if одна строчка условия. Это не очень хорошо ИМХО, т.к. сам я пару раз ошибался и искал ошибку довольно долго, когда требовалось добавить ещё строчку в условие и на автомате дописываешь её после текущей, забыв про то, что код после if не заключен в {}. Баги после этого могут быть весьма интересными.

И да, выложи это на github или ещё куда-то, где можно смотреть код, не скачивая архив.

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

Не люблю, ты прав. Добавляет кучу пустоты и ненужных строк, но так еще не ошибся пока что ни разу.
Залил на битведро, 1й пост обновил.

zlofenix
() автор топика

несколько дней вебсерв спокойно принимает подключения и выдает ответы, но потом, без ошибок и прочего, перестает, хром говорит ERR_CONN_RESET, а почему - отловить никак не выходит

Ставлю на незакрытые сокеты, кончаются дескрипторы. Можешь нагнать нагрузки каким нибудь siege, тогда загнётся за несколько секунд(если сокеты всегда не закрываются). Мониторь количество открытых процессом fd

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

Не думаю, лимит 4096, да и после окончания записи буферов - сразу идет shutdown&close. Но проверю.

zlofenix
() автор топика

моя плакаль, man gdb ? gdb -p pid и отлаживай

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

Кстати в этом случае лог бы был полон ошибок почти наверняка. Пока 20-23 дескриптора в общей сложности открыто, из них 6 не сокеты. Проверять через siege - немного не тот эффект, ну и проверка DoSом не лучший вариант, наверно.

zlofenix
() автор топика
Ответ на: комментарий от MKuznetsov

Чистилка созданных классов сокетов, создаются при accept, удаляются через ~15 секунд после дисконнекта.

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

Чистилка созданных классов сокетов, создаются при accept, удаляются через ~15 секунд после дисконнекта.

вот там и копайте

потому как

несколько дней вебсерв спокойно принимает подключения и выдает ответы, но потом, без ошибок и прочего, перестает

говорит о утечке ресурсов. Valgrind и прочие тут не помогут - ресурсы «утекают» штатно

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

Это не DoS, это нагрузочное тестирование, которое в любом случае надо периодически проводить. Хуже от него не станет, временные затраты небольшие, может выловить эту ошибку или другие.

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

Не, когда сокеты туда добавляеются - удаляются 100%.

zlofenix
() автор топика
Ответ на: комментарий от disarmer

Похоже на правду, уже 69 дескрипторов открыто, буду дописывать проверку мертвых и допишу логов в accept, спасибо.

Ну а вообще по WebServerSocket есть у кого мнения?

zlofenix
() автор топика
Ответ на: комментарий от pef-secure

Смотрел когда-то на него, не понравилось, да и у меня универсальная основа, можно прикручивать что хочется и как хочется, без сторонних либ, а скрещивать libev и мое - еще хуже.

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

я не особо знаю, чем libev лучше libevent, но в libevent есть прекраснейшая концепция bufferevent.

Штука хороша тем, что мегаудобно парсить протоколы: смотришь сколько у тебя байт в буфере и если не хватает, то просишь разбудить, когда хватит.

Must have в любом подобном проекте.

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