Elite Games - Свобода среди звезд!
.
ВНИМАНИЕ!
Наша конференция посвящена космической тематике и компьютерным играм.
Политические вопросы и происходящие в мире события в данный момент на нашем сайте не обсуждаются!

  » C, С++ | страница 29
Конференция предназначена для общения пилотов. Для удобства она разделена на каналы, каждый из которых посвящен определенной игре. Пожалуйста, открывайте темы только в соответствующих каналах и после того, как убедитесь, что данный вопрос не обсуждался ранее.

Поиск | Правила конференции | Фотоальбом | Регистрация | Список пилотов | Профиль | Войти и проверить личные сообщения | Вход

   Страница 29 из 37
На страницу: Пред.  1, 2, 3 ... 28, 29, 30 ... 35, 36, 37  След.    Перейти:   Все страницы
Поиск в этой теме:
Железный канал: «C, С++»
AnrDaemon
 857 EGP


Модератор
Рейтинг канала: 8(784)
Репутация: 37
Сообщения: 12292

Зарегистрирован: 17.10.2004
Гугл ладно, что отладка подсказала?
Что именно получает приложение, и что отдаёт?
_________________
Люблю свободный полёт... :)
    Добавлено: 19:11 23-08-2014   
SecondShadow
 365 EGP


Рейтинг канала: 6(372)
Репутация: -4
Сообщения: 1454 Заблокирован
Откуда: Бийск. Алтай.
Зарегистрирован: 09.02.2008
ТехноМаг :
в ней передается картинка

Из этой вырезки непонятно sstat.st_size это кто? В смысле целое число? Всегда? Посмотреть, что туда может передаваться.
_________________
Склероз - классная болезнь, ничего не болит и новости каждый день.
    Добавлено: 19:23 23-08-2014   
ТехноМаг
 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 раз
    Добавлено: 19:30 23-08-2014   
Endeavour
 1015 EGP


Рейтинг канала: 6(322)
Репутация: 105
Сообщения: 7041
Откуда: guess
Зарегистрирован: 26.05.2005
Ограничение в количество открытых сокетов/файлов?
    Добавлено: 20:24 23-08-2014   
AnrDaemon
 857 EGP


Модератор
Рейтинг канала: 8(784)
Репутация: 37
Сообщения: 12292

Зарегистрирован: 17.10.2004
Таки весь ввод-вывод надо обкладывать критическими секциями. Чтобы проблемы в сокетах не рушили логику программы. IMO.
_________________
Люблю свободный полёт... :)
    Добавлено: 21:11 23-08-2014   
ТехноМаг
 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 раз(а)
    Добавлено: 22:34 23-08-2014   
AnrDaemon
 857 EGP


Модератор
Рейтинг канала: 8(784)
Репутация: 37
Сообщения: 12292

Зарегистрирован: 17.10.2004
Ещё раз - исключительных ситуаций надо ЖДАТЬ! А не искать способ, как от них избавиться.
Ждать и обрабатывать. Корректно завершая работу приложения при необходимости. А не падая в корку, как барышня, увидевшая мышь.
_________________
Люблю свободный полёт... :)
    Добавлено: 23:08 23-08-2014   
ТехноМаг
 360 EGP


Рейтинг канала: 2(21)
Репутация: 93
Сообщения: 2510
Откуда: Кронштадт
Зарегистрирован: 09.04.2007
Дружище, как бэ выше описанное не есть исключительная ситуация.

Исключительная ситуация это когда дескриптор не может быть открыт или accept не отработал при подключении. Эти обработчики уже есть и работают.

Данная ситуация является корректной. Ну уж если на то пошло, то, чтобы ее вообще поймать будет необходимо ставить хуки на сигналы через sigset sigblock, что в принципе и так сделано чуть ранее в модуле демонизации. Крит секцию в fwrite ставить смысла нету, ибо:
1) это и так крит секция (см. спецификацию)
2) Пока выполняется писака процесс засыпает до окончания выполнения функции (см. спецификацию)

опять же. В спецификации и в man рекомендуют использовать fork для обработки большого кол-ва запросов.

Смысла мазать масло поверх масла я не вижу.
_________________
(Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."
    Добавлено: 23:21 23-08-2014   
AnrDaemon
 857 EGP


Модератор
Рейтинг канала: 8(784)
Репутация: 37
Сообщения: 12292

Зарегистрирован: 17.10.2004
Раз программа крашится, значит уже ситуация некорректная Улыбка
Логика то в общем-то простая.

P.S.
fork для обработки БОЛЬШОГО (десятки тысяч) числа запросов категорически НЕ годится. Просто потому что он дико медленный и накладыне расходы огромны.

P.P.S.
Напиши простой враппер под xinetd и пусть у того голова болит, что и как там юзер запрашивает.
_________________
Люблю свободный полёт... :)

Последний раз редактировалось: AnrDaemon (23:32 23-08-2014), всего редактировалось 2 раз(а)
    Добавлено: 23:31 23-08-2014   
ТехноМаг
 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 раз
    Добавлено: 23:39 23-08-2014   
AnrDaemon
 857 EGP


Модератор
Рейтинг канала: 8(784)
Репутация: 37
Сообщения: 12292

Зарегистрирован: 17.10.2004
SIGTERM != SIGKILL
По TERM у программы всегда есть выбор, умереть сразу, или подождать, пока дети встанут на ноги тоже сдохнут.
В твоём же случае я вообще не понимаю, откуда берётся SIGTERM при операции на сокете. Может, ты что-то не так интепретируешь?
_________________
Люблю свободный полёт... :)
    Добавлено: 01:13 24-08-2014   
ТехноМаг
 360 EGP


Рейтинг канала: 2(21)
Репутация: 93
Сообщения: 2510
Откуда: Кронштадт
Зарегистрирован: 09.04.2007
SIGTERM посылается ОС в случае, если клиент разорвал соединение до окончания передачи данных с сервера, чтобы избежать access violontation (segmentation) и сервер не убился (контрольный в голову, чтобы сам не застрелился). Это прописано в самом сокете.

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

Остается опять же fork...

В Apache2 например активно используется и практикуется (ла и в NGINX тоже).
_________________
(Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."
    Добавлено: 01:45 24-08-2014   
AnrDaemon
 857 EGP


Модератор
Рейтинг канала: 8(784)
Репутация: 37
Сообщения: 12292

Зарегистрирован: 17.10.2004
В Apache2 несколько MPM, prefork - старейший из них, но далеко не самый производительный.
А вот nginx не использует форки для обработки подключений, на сколько я знаю, и это его главное отличие от Апач-префорк.
Та же система обработки подключений, что используется в nginx, задействована в другом Apache MPM - -event.
C 2.4 -event доступен в стандартной поставке.
_________________
Люблю свободный полёт... :)
    Добавлено: 01:50 24-08-2014   
Sh.Tac.
 151 EGP


Рейтинг канала: 1(2)
Репутация: 14
Сообщения: 1426

Зарегистрирован: 27.07.2005
ТехноМаг :
с сокетами я работал ранее крайне мало

я тут не увидел работу с сокетами, сокет, скажем так, совместим с файловым дескриптором, но у него свои методы записи/чтения send()/recv()
_________________
This is what you get ...
(c) Radiohead
    Добавлено: 02:08 24-08-2014   
ТехноМаг
 360 EGP


Рейтинг канала: 2(21)
Репутация: 93
Сообщения: 2510
Откуда: Кронштадт
Зарегистрирован: 09.04.2007
Sh.Tac. :
записи/чтения send()/recv()


абсолютно верно. тут была проблема, что проблематично узнать/рассчитать полный размер отправляемого пакета, поэтому начал работать с сокетом через файло.

Как вариант отправить несколько пакетов через send, но я не уверен, что такой подход корректно будет воспринят браузером (хотя можно будет поставить флажег NOSIGNAL, что автоматически решит все проблемы...)
_________________
(Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."
    Добавлено: 02:11 24-08-2014   
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
    Добавлено: 02:18 24-08-2014   
ТехноМаг
 360 EGP


Рейтинг канала: 2(21)
Репутация: 93
Сообщения: 2510
Откуда: Кронштадт
Зарегистрирован: 09.04.2007
Sh.Tac. :
image слать в base64


а вот с этого места поподробнее... Нигде не видел, чтобы картинка слалась в Content-Type тем более в base Подозрение.
_________________
(Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."
    Добавлено: 02:23 24-08-2014   
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 раз
    Добавлено: 02:27 24-08-2014   
AnrDaemon
 857 EGP


Модератор
Рейтинг канала: 8(784)
Репутация: 37
Сообщения: 12292

Зарегистрирован: 17.10.2004
ТехноМаг :
абсолютно верно. тут была проблема, что проблематично узнать/рассчитать полный размер отправляемого пакета

C какой целью ты рассчитываешь "точный размер отправляемого пакета"?

Цитата:
Как вариант отправить несколько пакетов через send, но я не уверен, что такой подход корректно будет воспринят браузером (хотя можно будет поставить флажег NOSIGNAL, что автоматически решит все проблемы...)

Браузеру строго пофиг до тех пор, пока ты отправляешь строки заголовка целыми пакетами.
Как только отправил завершающую заголовок пустую строку, можешь делать, что в голову взбредёт.

Sh.Tac. :
http оно же тупое, и строчное, ожидает в конце \r\n\r\n\, всякие картинки надо в разделе content-type image слать в base64

Простите ради бога, вы не подскажете вашего поставщика?
_________________
Люблю свободный полёт... :)
    Добавлено: 02:31 24-08-2014   
ТехноМаг
 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 раз(а)
    Добавлено: 02:36 24-08-2014   
Железный канал: «C, С++»
На страницу: Пред.  1, 2, 3 ... 28, 29, 30 ... 35, 36, 37  След.    Перейти:   Все страницы
  
Показать: 
Предыдущая тема | Следующая тема |
К списку каналов | Наверх страницы
Цитата не в тему: Вот думаю - Х2 запустить, что-ли... Но стыдно. Итак друзья уже подкалывают, когда я говорю, что "работаю" - спрашивают: "Сколько фабрик поставил?" (Viking на работе)

  » C, С++ | страница 29
Каналы: Новости | Elite | Elite: Dangerous | Freelancer | Star Citizen | X-Tension/X-BTF | X2: The Threat | X3: Reunion | X3: Terran Conflict | X Rebirth | X4: Foundations | EVE Online | Orbiter | Kerbal Space Program | Evochron | VoidExpanse | Космические Миры | Онлайновые игры | Другие игры | Цифровая дистрибуция | play.elite-games.ru | ЗВ 2: Гражданская война | Творчество | Железо | Игра Мечты | Сайт
   Дизайн Elite Games V5 beta.18