![]() |
|
Модераторы: feodorv |
![]()
|
|
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 10 Всего: 45 |
То есть не всё гладко?))) Странно, может ntohs(cd->id) виновато? -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| MnxVol |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 15.1.2008 Репутация: нет Всего: нет |
Не понимаю, что было виной, но сначала он не хотел работать с константой, определенной как unsigned short const REQ_REQUEST = 0x0200; пытался определить ее по-другому - та ошибка пропала, но желаемого результата я не получил. Не уверен что ntohs(cd->id) виновато, потому что в операторе if оно отрабатывает. Да, не все гладко. При долгосрочном тесте почему-то программа виснет. Сейчас проверяю.
вот то, что у меня получилось:
Это сообщение отредактировал(а) feodorv - 30.12.2012, 12:30 |
|||
|
||||
| feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 10 Всего: 45 |
Так в том-то и дело, что не должен закрываться сокет после каждого url. Соединение действует постоянно. Судя по всему, программа виснет, когда циска закрывает соединение (по каким причинам - тоже выяснить бы нужно, возможно, прочла из сокета некорректный ответ). В этом случае recv возвращает 0. Проверки на этот случай в программе нет, а она нужна: Кроме того, в случае возврата циске положительного решения подпрограмма process_socket явным образом не возвращает никакого значения (а, следовательно, возвращает случайный мусор, хотя обязана вернуть 1 или 0): И довольно странный подход к указателю cd. Почему (*cd).id, а не cd->id? Добавлено через 3 минуты и 54 секунды Соответственно
Это сообщение отредактировал(а) feodorv - 27.11.2012, 12:08 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
| MnxVol |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 15.1.2008 Репутация: нет Всего: нет |
Изменил то, на что вы указали - работает, спасибо! За 16 часов не вылетела ни разу, постоянно обрабатывает запросы. Подскажите еще, с помощью чего лучше реализовать регулярные выражения на С, чтобы разобрать url и сравнить с файлом, содержащим маски запрещенных ресурсов, и еще, есть ли смысл какие-то функции перенести на 64-битную ось. Я например не нашел 64 битного аналого функции recv, зато есть 64 битная функция open, что в данном случае будет лучше?
|
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 10 Всего: 45 |
Очень хорошо! А его и нету))) Если Вы задумались над 64-битной версией, то работа с сетью останется прежней, но в Вашем коде прежде всего нужно обратить внимание на структуру cisdata и pragma pack. Вообще структура этой структуры мне не нравится, ужасное выравнивание, в 64-битном окружении стоит переписать работу с ней.
Ну, для этого вопроса лучше всего открыть новую тему Это сообщение отредактировал(а) feodorv - 29.11.2012, 03:36 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| MnxVol |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 15.1.2008 Репутация: нет Всего: нет |
Еще маленький вопрос, все конечно работает, но сегодня заметил - не поступало запросов в течении часа - и программа не захотела закрывать сокет, весь час ждала запросов на этом сокете. Может как-то реализовать выход по таймауту? Я сегодня буду пытаться прикрутить многозадачность, а в таком случае это будет лишь бесконечное множество процессов))
вот так примерно пока у меня в голове многозадачность выглядит, пока правда не проверял, сегодня займусь.
|
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 10 Всего: 45 |
И? Дальше-то работала? Это нормальное поведение сервера. Не вижу причин для закрытия сокета. Зачем? Где-то так, только это самоубийство))) Не нужен waitpid: Программирование сокетов в Linux -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| MnxVol |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 15.1.2008 Репутация: нет Всего: нет |
Дальше работала, но у меня может быть до 1000, а может и больше, одновременных подключений, получается каждое подключение будет висеть незакрытым, рано или поздно закончатся файловые дескрипторы в системе.
|
|||
|
||||
| feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 10 Всего: 45 |
Честно говоря, моё терпение начинает подходить к концу))))
Почему Вы зависли на идее, что для каждого запроса нужно открывать новый сокет? Если так действовать, то, да, рано или поздно закончатся файловые дескрипторы. Посмотрите как следует код, в каких случаях происходит переоткрытие сокета, в каких случаях используется (многократно) уже созданный и уже присоединённый сокет nsd. -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
| MnxVol |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 15.1.2008 Репутация: нет Всего: нет |
Извиняюсь, не понял Вас изначально до конца) А тогда если делать fork, то как я понимаю, процессы будут распараллеливаться, там тоже будет все нормально? Я как понял, по идее, в дочерней копии процесса происходит обработка, и если обработка завершена, процесс закроется, и управление вернется родительскому процессу, так?
|
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 10 Всего: 45 |
Будет))) Только не нужно делать так: Родительский процесс должен работать вне зависимости от дочернего -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Сети | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |