![]() |
|
Модераторы: xvr |
![]()
|
|
| fray |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 139 Регистрация: 7.6.2007 Репутация: нет Всего: 0 |
Просто я функцией select проверяю сокеты(не блокирующиеся), она выдает мне спиосок сокетов коннет которых с сервером уже пропал, а как сделать что бы коннект не пропадал c http-сервером(при условии что http -сервер это разрешает) ?
Это сообщение отредактировал(а) fray - 13.12.2007, 20:05 |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
какая ОС?
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| fray |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 139 Регистрация: 7.6.2007 Репутация: нет Всего: 0 |
линукс, ну в крайнем случае сигвин. |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
вообще select() проверяет возможность неблокирующего чтения/записи с использованием дескрипторов при чем здесь коннект? -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| GrayCardinal |
|
|||
|
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 8 Всего: 58 |
getpeername (если память мне не изменяет) - выдаст адрес "другой стороны" подключенного сокета... возможно, вам это надо
Это сообщение отредактировал(а) GrayCardinal - 14.12.2007, 12:13 |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
Дурацкий вопрос - а ты http серверу сказал, что не надо закрывать http соединение после сеанса обмена ? Это сообщение отредактировал(а) xvr - 14.12.2007, 16:08 |
|||
|
||||
| fray |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 139 Регистрация: 7.6.2007 Репутация: нет Всего: 0 |
ну я делаю так создаю сокет делаю не блокирующим конекчу его, потом проверяю select()ом можно ли в него писать или нет, если да то пишу, далее тем же select()ьом проверяю можно ли из него читать если да то читаю, на один http запрос (GET / HTTP/1.1\r\nHost: %s\r\nConnection: Close\r\n\r\n", hostname) этого хватает, потом как я пинимаю сервер зкрывает соединение на другом конце, то есть connect() пропадает, то есть как мне казалось select() должен мне тперь сказать что типа нельзя болье писать в этот сокет, а он говорит что можно. Добавлено @ 18:38
да вопрос действительно дурацкий, но иногда приходится и такие вопросы задавать, дело в том что тут два вопроса в одном, почему коннект пропадает и как узнать что коннект еще есть , да вроде ставил keep-alive в http запросе результат тот же. Сейчас попробовал sprintf(request, "GET / HTTP/1.1\r\nHost: %s\r\nConnection: Keep-Alive\r\n\r\n", hostname);sprintf(request, "GET / HTTP/1.1\r\nHost: %s\r\nConnection: Keep-Alive\r\n\r\n", hostname); и так тоже sprintf(request, "GET / HTTP/1.1\r\nHost: %s\r\n\r\n", hostname); результак как и с Connection: Close, в настройках апача стоит Кеер-Alive on Добавлено @ 18:41
ок проверим Это сообщение отредактировал(а) fray - 14.12.2007, 19:10 |
||||||
|
|||||||
| Олег2005 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 421 Регистрация: 26.5.2005 Где: Рига Латвия Репутация: 1 Всего: 11 |
Нормальный сервер не может держать соединение открытым бесконечно - и обычно в Апачах он держит его 10 сек (это настраивается в конфиге) - иначе таких соединений висящих будет сотни тысяч. Для имитации открытого соединение со стороны клиента достаточно сокет создать с флагом TCP_KEEPALIVE и установить опцию сокета SO_KEEPALIVE |
|||
|
||||
| fray |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 139 Регистрация: 7.6.2007 Репутация: нет Всего: 0 |
надеюсь этого будет достаточно
только вот ругается на TCP_KEEPALIVE в каком хедере определен ? Это сообщение отредактировал(а) fray - 15.12.2007, 00:19 |
||||
|
|||||
| xvr |
|
||||||||||||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
Ты сам его попросил закрыть соединение (Connection: Close), что он и сделал
Это тебе скажет write, и то не сразу.
Для http 1.1 keep-alive включен по умолчанию, если не стоит Connection: Close
Это странно, должно работать
Статус подключения он не выдаст :( Это сообщение отредактировал(а) xvr - 15.12.2007, 11:16 |
||||||||||||||||||
|
|||||||||||||||||||
| fray |
|
||||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 139 Регистрация: 7.6.2007 Репутация: нет Всего: 0 |
Да это тоже работает но не так как надо всмысле посылаю запрос получаю первый ответ а потом висим опрашивая дескрипторы poll(), апач в ответе отвечает keep-alive, timeout 10, было так
Короче нужен мне был клиент качающий в несколько потоков, вернулся назад к закрывающемуся соединению. хотя конечно хотелось бы добиться чтобы соединение не разрывалось как можно дольше, может апач не хочет чтобы я ему слал одинаковые запросы GET / к начальной странице.
Это сообщение отредактировал(а) fray - 15.12.2007, 20:40 |
||||||||
|
|||||||||
| Олег2005 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 421 Регистрация: 26.5.2005 Где: Рига Латвия Репутация: 1 Всего: 11 |
Надо иметь в виду, что KEEPALIVE протокола HTTP не имеет ничего общего с
TCP_KEEPALIVE |
|||
|
||||
| fray |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 139 Регистрация: 7.6.2007 Репутация: нет Всего: 0 |
если под TCP_KEEPALIVE вы понимаете это, то это я включал
и если TCP_KEEPALIVE никак не связано с KEEPALIVE протокола HTTP, то чтобы не делать такой запрос GET / HTTP/1.1\r\nHost: %s\r\nConnection: Close\r\n\r\n" и по новой создавать каждый раз socket() и connect(). Это сообщение отредактировал(а) fray - 15.12.2007, 23:30 |
||||
|
|||||
| Олег2005 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 421 Регистрация: 26.5.2005 Где: Рига Латвия Репутация: 1 Всего: 11 |
Cервер HTTP/1.1 - даже если ему ничего типа Keepalive не слать - будет несколько секунд держать соединение после отсылки ответа клиенту Поэтому я лично не очень понимаю суть поставленной вами проблем - открыли сокет, сконнектились, послали запрос и вышли на recv() и ждем ответа сервера. Быстренько его парсим - и если нужны картинки, выдаем запрос по тому же сокету - но уже на картиночный файл - это я в качестве идеологии привожу - и сервер обязан держать соединение открытым мин 10 секунд. Это сообщение отредактировал(а) Олег2005 - 15.12.2007, 23:08 |
|||
|
||||
| fray |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 139 Регистрация: 7.6.2007 Репутация: нет Всего: 0 |
может я что-то не пойму конечно, но я делаю так sd=socket () // создал сокет O_NONBLOCK // сделал не блокирующим setsockopt(sd,SO_KEEPALIVE) // делаю его кипэлайф connect (sd); // конекчу скармливаю sd poll()'y while ( poll() ) // опрашитваю пулл { если Можно читать данные то read() если Можно писать данные то write() } казалось бы по вашим словам если коннект держится в течении 10 секунд должен идти беспрерывный обмен данными но на деле получается что я шлю запрос и получаю один ответ, коннек держится 10 сек а потом poll отвечает мне что произошла ошибка. Поэтому для каждого запроса я создаю сокет и коннект, а это как-то не экономично. Это сообщение отредактировал(а) fray - 16.12.2007, 01:14 |
|||
|
||||
![]()
|
| Правила форума "С/С++: Программирование под Unix/Linux" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |