Модераторы: xvr

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как узнать что сокет продконнекчен ? что записать туда данные. 
:(
    Опции темы
fray
Дата 13.12.2007, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 7.6.2007

Репутация: нет
Всего: 0



Просто я функцией select проверяю сокеты(не блокирующиеся), она выдает мне спиосок сокетов коннет которых с сервером уже пропал, а как сделать что бы коннект не пропадал c http-сервером(при условии что http -сервер это разрешает) ?

Это сообщение отредактировал(а) fray - 13.12.2007, 20:05
PM MAIL   Вверх
MAKCim
Дата 13.12.2007, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



какая ОС?


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
fray
Дата 14.12.2007, 01:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 7.6.2007

Репутация: нет
Всего: 0



Цитата(MAKCim @ 13.12.2007,  21:50)
какая ОС?

линукс, ну в крайнем случае сигвин.
PM MAIL   Вверх
MAKCim
Дата 14.12.2007, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(fray @  13.12.2007,  20:03 Найти цитируемый пост)
она выдает мне спиосок сокетов коннет которых с сервером уже пропал, а как сделать что бы коннект не пропадал c http-сервером

вообще select() проверяет возможность неблокирующего чтения/записи с использованием дескрипторов
при чем здесь коннект?


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
GrayCardinal
Дата 14.12.2007, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



getpeername (если память мне не изменяет) - выдаст адрес "другой стороны" подключенного сокета... возможно, вам это надо  smile 

Это сообщение отредактировал(а) GrayCardinal - 14.12.2007, 12:13


--------------------
PM MAIL WWW   Вверх
xvr
Дата 14.12.2007, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(fray @ 13.12.2007,  20:03)
Просто я функцией select проверяю сокеты(не блокирующиеся), она выдает мне спиосок сокетов коннет которых с сервером уже пропал, а как сделать что бы коннект не пропадал c http-сервером(при условии что http -сервер это разрешает) ?

Дурацкий вопрос - а ты http серверу сказал, что не надо закрывать http соединение после сеанса обмена ?


Это сообщение отредактировал(а) xvr - 14.12.2007, 16:08
PM MAIL   Вверх
fray
Дата 14.12.2007, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 7.6.2007

Репутация: нет
Всего: 0



Цитата(MAKCim @ 14.12.2007,  10:32)
Цитата(fray @  13.12.2007,  20:03 Найти цитируемый пост)
она выдает мне спиосок сокетов коннет которых с сервером уже пропал, а как сделать что бы коннект не пропадал c http-сервером

вообще select() проверяет возможность неблокирующего чтения/записи с использованием дескрипторов
при чем здесь коннект?

ну я делаю так создаю сокет делаю не блокирующим конекчу его, потом проверяю select()ом можно ли в него писать или нет, если да то пишу, далее тем же select()ьом проверяю можно ли из него читать если да то читаю, на один http запрос (GET / HTTP/1.1\r\nHost: %s\r\nConnection: Close\r\n\r\n", hostname) этого хватает, потом как я пинимаю сервер зкрывает соединение на другом конце, то есть connect() пропадает, то есть как мне казалось select() должен мне тперь сказать что типа нельзя болье писать в этот сокет, а он говорит что можно.

Добавлено @ 18:38
Цитата(xvr @ 14.12.2007,  16:08)
Цитата(fray @ 13.12.2007,  20:03)
Просто я функцией select проверяю сокеты(не блокирующиеся), она выдает мне спиосок сокетов коннет которых с сервером уже пропал, а как сделать что бы коннект не пропадал c http-сервером(при условии что http -сервер это разрешает) ?

Дурацкий вопрос - а ты http серверу сказал, что не надо закрывать http соединение после сеанса обмена ?

да вопрос действительно дурацкий, но иногда приходится и такие вопросы задавать, дело в том что тут два вопроса в одном, почему коннект пропадает  и как узнать что коннект еще есть , да вроде ставил 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
Цитата(GrayCardinal @ 14.12.2007,  12:12)
getpeername (если память мне не изменяет) - выдаст адрес "другой стороны" подключенного сокета... возможно, вам это надо  smile

ок проверим

Это сообщение отредактировал(а) fray - 14.12.2007, 19:10
PM MAIL   Вверх
Олег2005
Дата 14.12.2007, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 421
Регистрация: 26.5.2005
Где: Рига Латвия

Репутация: 1
Всего: 11



Цитата(fray @  14.12.2007,  18:35 Найти цитируемый пост)
в настройках апача стоит Кеер-Alive on 

Нормальный сервер не может держать соединение открытым бесконечно - и обычно в Апачах он держит его 10 сек (это настраивается в конфиге) - иначе таких соединений висящих будет сотни тысяч.
Для имитации открытого соединение со стороны клиента достаточно сокет создать с флагом TCP_KEEPALIVE и установить опцию сокета SO_KEEPALIVE 
PM MAIL WWW MSN   Вверх
fray
Дата 15.12.2007, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 7.6.2007

Репутация: нет
Всего: 0



Цитата(Олег2005 @ 14.12.2007,  19:20)
Цитата(fray @  14.12.2007,  18:35 Найти цитируемый пост)
в настройках апача стоит Кеер-Alive on 

Нормальный сервер не может держать соединение открытым бесконечно - и обычно в Апачах он держит его 10 сек (это настраивается в конфиге) - иначе таких соединений висящих будет сотни тысяч.
Для имитации открытого соединение со стороны клиента достаточно сокет создать с флагом TCP_KEEPALIVE и установить опцию сокета SO_KEEPALIVE

надеюсь этого будет достаточно smile.
Код

        int on = 1;
        setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, &on, sizeof(on) ); 
        setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPALIVE, &on, sizeof(on));

только вот ругается на TCP_KEEPALIVE в каком хедере определен ?

Это сообщение отредактировал(а) fray - 15.12.2007, 00:19
PM MAIL   Вверх
xvr
Дата 15.12.2007, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(fray @ 14.12.2007,  18:35)
Цитата(MAKCim @ 14.12.2007,  10:32)
Цитата(fray @  13.12.2007,  20:03 Найти цитируемый пост)
она выдает мне спиосок сокетов коннет которых с сервером уже пропал, а как сделать что бы коннект не пропадал c http-сервером

вообще select() проверяет возможность неблокирующего чтения/записи с использованием дескрипторов
при чем здесь коннект?

ну я делаю так создаю сокет делаю не блокирующим конекчу его, потом проверяю select()ом можно ли в него писать или нет, если да то пишу, далее тем же select()ьом проверяю можно ли из него читать если да то читаю, на один http запрос (GET / HTTP/1.1\r\nHost: %s\r\nConnection: Close\r\n\r\n", hostname) этого хватает, 

Ты сам его попросил закрыть соединение (Connection: Close), что он и сделал

Цитата

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

Это тебе скажет write, и то не сразу.

Цитата

Цитата

Дурацкий вопрос - а ты http серверу сказал, что не надо закрывать http соединение после сеанса обмена ?

да вопрос действительно дурацкий, но иногда приходится и такие вопросы задавать, дело в том что тут два вопроса в одном, почему коннект пропадает  и как узнать что коннект еще есть , да вроде ставил keep-alive в http запросе результат тот же. 

Для http 1.1 keep-alive включен по умолчанию, если не стоит Connection: Close

Цитата

Сейчас попробовал 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
Цитата(GrayCardinal @ 14.12.2007,  12:12)
getpeername (если память мне не изменяет) - выдаст адрес "другой стороны" подключенного сокета... возможно, вам это надо  smile

ок проверим

Статус подключения он не выдаст :(


Это сообщение отредактировал(а) xvr - 15.12.2007, 11:16
PM MAIL   Вверх
fray
Дата 15.12.2007, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 7.6.2007

Репутация: нет
Всего: 0



Цитата(xvr @  15.12.2007,  11:15 Найти цитируемый пост)
Для http 1.1 keep-alive включен по умолчанию, если не стоит Connection: Close
Цитата
Сейчас попробовал 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 

Это странно, должно работать


Да это тоже работает но не так как надо всмысле посылаю запрос получаю первый ответ а потом висим опрашивая дескрипторы poll(), апач в ответе отвечает keep-alive, timeout 10, было так 
Код

sprintf(request, "GET / HTTP/1.1\r\nHost: %s\r\nKeep-Alive: 300\r\nConnection: keep-alive\r\nReferer: http://%s/\r\n\r\n", hostname, hostname); 
 +        
Код

int on = 1;
        setsockopt(sd, SOL_SOCKET, SO_KEEPALIVE, &on, sizeof(on)); 
        setsockopt(sd, IPPROTO_TCP, SO_KEEPALIVE, &on, sizeof(on)); // хотя не знаю правильно ли это :)

Короче нужен мне был клиент качающий в несколько потоков, вернулся назад к закрывающемуся соединению. хотя конечно хотелось бы добиться чтобы соединение не разрывалось как можно дольше, может апач не хочет чтобы я ему слал одинаковые запросы  GET / к начальной странице.
Код

sprintf(request, "GET / HTTP/1.1\r\nHost: %s\r\nConnection: Close\r\n\r\n", hostname);



Это сообщение отредактировал(а) fray - 15.12.2007, 20:40
PM MAIL   Вверх
Олег2005
Дата 15.12.2007, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 421
Регистрация: 26.5.2005
Где: Рига Латвия

Репутация: 1
Всего: 11



Надо иметь в виду, что KEEPALIVE протокола HTTP не имеет ничего общего с 
TCP_KEEPALIVE 
PM MAIL WWW MSN   Вверх
fray
Дата 15.12.2007, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 7.6.2007

Репутация: нет
Всего: 0



Цитата(Олег2005 @ 15.12.2007,  20:46)
Надо иметь в виду, что KEEPALIVE протокола HTTP не имеет ничего общего с 
TCP_KEEPALIVE

если под TCP_KEEPALIVE вы понимаете это, то это я включал
Код

#ifdef TCP_KEEPALIVE
  len = 0;
  if(setsockopt(*newSocket, SOL_SOCKET, SO_KEEPALIVE, (char*)&len, 
        sizeof(len)) == -1){
     perror("tcp_listen: setsockopt(SO_KEEPALIVE)"); return FALSE;
  }
#endif

и если  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
PM MAIL   Вверх
Олег2005
Дата 15.12.2007, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 421
Регистрация: 26.5.2005
Где: Рига Латвия

Репутация: 1
Всего: 11



Цитата

Connection      
 Постоянные соединения для сообщений HTTP/1.1 работают по умолчанию; для декларации непостоянства соединения вводится ключевое слово close. Ниже описана оригинальная форма постоянных соединений для HTTP/1.0. Когда HTTP клиент соединяется с исходным сервером, он может послать лексему соединения Keep-Alive в дополнение к лексеме соединения Persist: 
Connection: Keep-Alive.
Клиент предлагает не закрывать TCP-соединение после обработки запроса, с тем чтобы это соединение могло быть использовано для последующих запросов и ответов на них. Если новые запросы не последовали в течение некоторого времени (несколько секунд), сервер закрывает соединение. Значение заголовка "Connection: close" указывает на то, что соединение будет закрыто после обработки данного запроса. 

Cервер  HTTP/1.1 - даже если ему ничего типа Keepalive не слать - будет несколько секунд держать соединение после отсылки ответа  клиенту
Поэтому я лично не очень понимаю суть поставленной вами проблем - открыли сокет, сконнектились, послали запрос и вышли на recv() и ждем ответа сервера. Быстренько его парсим - и если нужны картинки, выдаем запрос по тому же сокету - но уже на картиночный файл - это я в качестве идеологии привожу - и сервер обязан держать соединение открытым мин 10 секунд.

Это сообщение отредактировал(а) Олег2005 - 15.12.2007, 23:08
PM MAIL WWW MSN   Вверх
fray
  Дата 16.12.2007, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 7.6.2007

Репутация: нет
Всего: 0



Цитата(Олег2005 @  15.12.2007,  23:07 Найти цитируемый пост)
я лично не очень понимаю суть поставленной вами проблем - открыли сокет, сконнектились, послали запрос и вышли на recv() и ждем ответа сервера. Быстренько его парсим - и если нужны картинки, выдаем запрос по тому же сокету - но уже на картиночный файл - это я в качестве идеологии привожу - и сервер обязан держать соединение открытым мин 10 секунд.

может я что-то не пойму конечно, но я делаю так 
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
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0827 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.