|
|
|
Железный канал: «C, С++» |
|
|
AnrDaemon 857 EGP
Рейтинг канала: 8(784) Репутация: 37 Сообщения: 12292
Зарегистрирован: 17.10.2004 |
|
Гугл ладно, что отладка подсказала?
Что именно получает приложение, и что отдаёт?
_________________ Люблю свободный полёт... :) |
|
|
SecondShadow 365 EGP
Рейтинг канала: 6(372) Репутация: -4 Сообщения: 1454 Заблокирован Откуда: Бийск. Алтай. Зарегистрирован: 09.02.2008 |
|
ТехноМаг : |
в ней передается картинка
|
Из этой вырезки непонятно sstat.st_size это кто? В смысле целое число? Всегда? Посмотреть, что туда может передаваться.
_________________ Склероз - классная болезнь, ничего не болит и новости каждый день. |
|
|
ТехноМаг 360 EGP
Рейтинг канала: 2(21) Репутация: 93 Сообщения: 2510 Откуда: Кронштадт Зарегистрирован: 09.04.2007 |
|
sstat это структура типа stat. В нее с помощью функции fstat помещаются данные файла. st_size - размер файла (не < 0, всегда целое).
Отладка ничего не показала. Просто приходит SIGTERM в приложение в момент вызова этой функции и все. Других ошибок нет. dmesg также пустой.
AnrDaemon : |
Что именно получает приложение, и что отдаёт?
|
Все стандартно и корректно получается и отдается.
От ГУгла приходит Request Header:
Cкрытый текст (кликните здесь для просмотра)
GET /bgpreload.gif HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Cache-Control: max-age=0
Accept: image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36
Referer: http://localhost:8080/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
|
в ответ приходит мой хедер:
Cкрытый текст (кликните здесь для просмотра)
HTTP/1.1 200 Ok
Server: darksword 1.0b
Content-Type: image/gif
Connection: close
|
и собственно картинка.
и в 99% случаех жто корректно работает. НО если в Гугле, и именно в нем зажать F5, то на 20ом или 25ом обновлении при вызове fwrite в сокет с данными картинки возвращается SIGTERM и досвидос.
Бональное решение конешн использовать fork(), но его нильзя, ибо из веба нужно будет передовать данные в другие модули.
В принципе это нормальное поведение сокетов, если клиент оборвал соединение в момент передачи данных. Вопрос как это обойти...
_________________ (Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."
Последний раз редактировалось: ТехноМаг (19:31 23-08-2014), всего редактировалось 1 раз |
|
|
Endeavour 1015 EGP
Рейтинг канала: 6(322) Репутация: 105 Сообщения: 7041 Откуда: guess Зарегистрирован: 26.05.2005 |
|
Ограничение в количество открытых сокетов/файлов?
|
|
|
AnrDaemon 857 EGP
Рейтинг канала: 8(784) Репутация: 37 Сообщения: 12292
Зарегистрирован: 17.10.2004 |
|
Таки весь ввод-вывод надо обкладывать критическими секциями. Чтобы проблемы в сокетах не рушили логику программы. IMO.
_________________ Люблю свободный полёт... :) |
|
|
ТехноМаг 360 EGP
Рейтинг канала: 2(21) Репутация: 93 Сообщения: 2510 Откуда: Кронштадт Зарегистрирован: 09.04.2007 |
|
AnrDaemon : |
обкладывать критическими секциями.
|
Поток как бэ один.
Endeavour : |
Ограничение в количество открытых сокетов/файлов?
|
1024 * 10 дескрипторов типа fileno
не тут суть именно в том, что умные Google сбрасывают коннект, если послан новый запрос на страницу. тот-же огнелис ждет когда пред. запрос завершится, и лишь потом рефрешится.
У функции send, например есть флаг NOSIGNAL, который запрещает слать SIGTERM в случае если данные шлются в пустоту. Но тут данные идут потоком через дескриптор сокета и флаг не поставить... надо подумать
попробую переписать таки через fork, как man советует. А передачу данных через интерфейс какой-нить замучу... либо через второй сокет, который в режиме noclose слушает соседний порт...
_________________ (Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."
Последний раз редактировалось: ТехноМаг (22:37 23-08-2014), всего редактировалось 2 раз(а) |
|
|
AnrDaemon 857 EGP
Рейтинг канала: 8(784) Репутация: 37 Сообщения: 12292
Зарегистрирован: 17.10.2004 |
|
Ещё раз - исключительных ситуаций надо ЖДАТЬ! А не искать способ, как от них избавиться.
Ждать и обрабатывать. Корректно завершая работу приложения при необходимости. А не падая в корку, как барышня, увидевшая мышь.
_________________ Люблю свободный полёт... :) |
|
|
ТехноМаг 360 EGP
Рейтинг канала: 2(21) Репутация: 93 Сообщения: 2510 Откуда: Кронштадт Зарегистрирован: 09.04.2007 |
|
Дружище, как бэ выше описанное не есть исключительная ситуация.
Исключительная ситуация это когда дескриптор не может быть открыт или accept не отработал при подключении. Эти обработчики уже есть и работают.
Данная ситуация является корректной. Ну уж если на то пошло, то, чтобы ее вообще поймать будет необходимо ставить хуки на сигналы через sigset sigblock, что в принципе и так сделано чуть ранее в модуле демонизации. Крит секцию в fwrite ставить смысла нету, ибо:
1) это и так крит секция (см. спецификацию)
2) Пока выполняется писака процесс засыпает до окончания выполнения функции (см. спецификацию)
опять же. В спецификации и в man рекомендуют использовать fork для обработки большого кол-ва запросов.
Смысла мазать масло поверх масла я не вижу.
_________________ (Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей." |
|
|
AnrDaemon 857 EGP
Рейтинг канала: 8(784) Репутация: 37 Сообщения: 12292
Зарегистрирован: 17.10.2004 |
|
Раз программа крашится, значит уже ситуация некорректная
Логика то в общем-то простая.
P.S.
fork для обработки БОЛЬШОГО (десятки тысяч) числа запросов категорически НЕ годится. Просто потому что он дико медленный и накладыне расходы огромны.
P.P.S.
Напиши простой враппер под xinetd и пусть у того голова болит, что и как там юзер запрашивает.
_________________ Люблю свободный полёт... :)
Последний раз редактировалось: AnrDaemon (23:32 23-08-2014), всего редактировалось 2 раз(а) |
|
|
ТехноМаг 360 EGP
Рейтинг канала: 2(21) Репутация: 93 Сообщения: 2510 Откуда: Кронштадт Зарегистрирован: 09.04.2007 |
|
AnrDaemon : |
Раз программа крашится
|
Та не крешится она. Она закрывается по SIGTERM, балин (вполне корректное закрытие между прочим).
Сам же писал
AnrDaemon : |
Ждать и обрабатывать. Корректно завершая работу приложения при необходимости.
|
Вот он и завершает
AnrDaemon : |
росто потому что он дико медленный и накладыне расходы огромны.
|
Где-то 500 в секунду надо обработать.
И тут увы без вариантов. Либо fork либо неблокирующие сокеты через set select. Поток не вариант - он половину запросов потеряет (ибо крит секция с очередью. Затирает он следующими, понимаешь ли).
AnrDaemon : |
апиши простой враппер под xinetd
|
а вот это уже мысль
_________________ (Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."
Последний раз редактировалось: ТехноМаг (23:45 23-08-2014), всего редактировалось 1 раз |
|
|
AnrDaemon 857 EGP
Рейтинг канала: 8(784) Репутация: 37 Сообщения: 12292
Зарегистрирован: 17.10.2004 |
|
SIGTERM != SIGKILL
По TERM у программы всегда есть выбор, умереть сразу, или подождать, пока дети встанут на ноги тоже сдохнут.
В твоём же случае я вообще не понимаю, откуда берётся SIGTERM при операции на сокете. Может, ты что-то не так интепретируешь?
_________________ Люблю свободный полёт... :) |
|
|
ТехноМаг 360 EGP
Рейтинг канала: 2(21) Репутация: 93 Сообщения: 2510 Откуда: Кронштадт Зарегистрирован: 09.04.2007 |
|
SIGTERM посылается ОС в случае, если клиент разорвал соединение до окончания передачи данных с сервера, чтобы избежать access violontation (segmentation) и сервер не убился (контрольный в голову, чтобы сам не застрелился). Это прописано в самом сокете.
Единственное, что я могу сделать, это вызвать некую функцию по этому сигналу и реинициализировать систему (но это тоже не гут, ибо остальные соединения убьются тоже).
Остается опять же fork...
В Apache2 например активно используется и практикуется (ла и в NGINX тоже).
_________________ (Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей." |
|
|
AnrDaemon 857 EGP
Рейтинг канала: 8(784) Репутация: 37 Сообщения: 12292
Зарегистрирован: 17.10.2004 |
|
В Apache2 несколько MPM, prefork - старейший из них, но далеко не самый производительный.
А вот nginx не использует форки для обработки подключений, на сколько я знаю, и это его главное отличие от Апач-префорк.
Та же система обработки подключений, что используется в nginx, задействована в другом Apache MPM - -event.
C 2.4 -event доступен в стандартной поставке.
_________________ Люблю свободный полёт... :) |
|
|
Sh.Tac. 151 EGP
Рейтинг канала: 1(2) Репутация: 14 Сообщения: 1426
Зарегистрирован: 27.07.2005 |
|
ТехноМаг : |
с сокетами я работал ранее крайне мало
|
я тут не увидел работу с сокетами, сокет, скажем так, совместим с файловым дескриптором, но у него свои методы записи/чтения send()/recv()
_________________ This is what you get ...
(c) Radiohead |
|
|
ТехноМаг 360 EGP
Рейтинг канала: 2(21) Репутация: 93 Сообщения: 2510 Откуда: Кронштадт Зарегистрирован: 09.04.2007 |
|
Sh.Tac. : |
записи/чтения send()/recv()
|
абсолютно верно. тут была проблема, что проблематично узнать/рассчитать полный размер отправляемого пакета, поэтому начал работать с сокетом через файло.
Как вариант отправить несколько пакетов через send, но я не уверен, что такой подход корректно будет воспринят браузером (хотя можно будет поставить флажег NOSIGNAL, что автоматически решит все проблемы...)
_________________ (Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей." |
|
|
Sh.Tac. 151 EGP
Рейтинг канала: 1(2) Репутация: 14 Сообщения: 1426
Зарегистрирован: 27.07.2005 |
|
http оно же тупое, и строчное, ожидает в конце \r\n\r\n\, всякие картинки надо в разделе content-type image слать в base64
_________________ This is what you get ...
(c) Radiohead |
|
|
ТехноМаг 360 EGP
Рейтинг канала: 2(21) Репутация: 93 Сообщения: 2510 Откуда: Кронштадт Зарегистрирован: 09.04.2007 |
|
Sh.Tac. : |
image слать в base64
|
а вот с этого места поподробнее... Нигде не видел, чтобы картинка слалась в Content-Type тем более в base
_________________ (Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей." |
|
|
Sh.Tac. 151 EGP
Рейтинг канала: 1(2) Репутация: 14 Сообщения: 1426
Зарегистрирован: 27.07.2005 |
|
и размер надо знать заранее, картинки той же, т.к. ты пробиваешь его в Content-Length, разберись с заголовками http, там несложно, а я всё это "веб-программирование" крайне ненавижу
З.Ы. накрайняк рекомендую отправлять GET в telnet на известный сервер, и смотреть что приходит, надо делать примерно так же
_________________ This is what you get ...
(c) Radiohead
Последний раз редактировалось: Sh.Tac. (02:31 24-08-2014), всего редактировалось 1 раз |
|
|
AnrDaemon 857 EGP
Рейтинг канала: 8(784) Репутация: 37 Сообщения: 12292
Зарегистрирован: 17.10.2004 |
|
ТехноМаг : |
абсолютно верно. тут была проблема, что проблематично узнать/рассчитать полный размер отправляемого пакета
|
C какой целью ты рассчитываешь "точный размер отправляемого пакета"?
Цитата: |
Как вариант отправить несколько пакетов через send, но я не уверен, что такой подход корректно будет воспринят браузером (хотя можно будет поставить флажег NOSIGNAL, что автоматически решит все проблемы...)
|
Браузеру строго пофиг до тех пор, пока ты отправляешь строки заголовка целыми пакетами.
Как только отправил завершающую заголовок пустую строку, можешь делать, что в голову взбредёт.
Sh.Tac. : |
http оно же тупое, и строчное, ожидает в конце \r\n\r\n\, всякие картинки надо в разделе content-type image слать в base64
|
Простите ради бога, вы не подскажете вашего поставщика?
_________________ Люблю свободный полёт... :) |
|
|
ТехноМаг 360 EGP
Рейтинг канала: 2(21) Репутация: 93 Сообщения: 2510 Откуда: Кронштадт Зарегистрирован: 09.04.2007 |
|
Sh.Tac. : |
и размер надо знать заранее
|
с картинкой-то понятно. Там размер сразу известен.
А вот с остальным текстовым уно черт поймет, ибо половина текстов генится на лету. Но щас подумаю еще. В принципе есть одна идейка, как все это рассчитать да и через send заслать.
PS: Content-Length уже дааавно не обязателен. И тот же самый Nginx его отдает только на text/html (и то не всегда).
добавлено спустя 53 секунды:
Sh.Tac. : |
накрайняк рекомендую отправлять GET в telnet
|
для этого есть curl -v
добавлено спустя 4 минуты:
AnrDaemon : |
точный размер отправляемого пакета
|
send требует указать пересылаемый размер. Но если можно в несколько проходов отослать все уно, то не проблема.
_________________ (Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."
Последний раз редактировалось: ТехноМаг (02:36 24-08-2014), всего редактировалось 2 раз(а) |
|
|
|
|
|
Железный канал: «C, С++» |
|