Форум программистов  
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 08.10.2016, 11:55   #1
Hailov
Пользователь
 
Регистрация: 08.10.2016
Сообщений: 18
Репутация: 40
По умолчанию wininet или socket одно соединение, несколько запросов

Добрый день.

Мне необходимо было читать кое-какую инфу со страничек html и я использовал wininet, писал на С++.
InternetOpen и InternetConnect держали постоянное соединение, шли GET запросы через связку HttpOpenRequest HttpSendRequest и чтение в цикле InternetReadFile.

Так как мне не нужна была вся инфа со странички, то я на определенной итерации прекращал чтение, и несколько позже слал новый запрос, используя существующее соединение. Все ОК.

И вот подобное понадобилось реализовать на сокетах.
И, я, видимо находясь в плену предыдушей модели, попал в ступор, тем более что с сокетами знакомство поверхностное.

Как на сокетах , используя одно соединение, послать следующий запрос не дочитывая до конца recv ответ предыдущего запроса?

У меня, во всяком случае, происходит вот что.
Код:


...
mysocket = socket (AF_INET, SOCK_STREAM, 0);
connect (mysocket,  .........

...
sending = "GET /forum.php HTTP/1.1 \r\n ......"; //  и прочие заголовки

send (mysocket, sending.buffer(), sending.count(), 0); 

char mess [1024];
while (1)
{
    recv (mysocket, mess , 1024, 0);

   if (X/*некое условие выхода из чтения*/)  
       break;
}

//здесь посылаю новый запрос, не дочитывая до конца предыдущий..
send (mysocket, ......

while (1)
{  // а здесь получаю продолжение предыдущего ответа, но он мне совсем  не нужен
    recv (mysocket, mess , 1024, 0);
.........

Короче говоря, без реконнекта ничего путного не выходит.

Мож кто что-нить подскажет.
Hailov вне форума   Ответить с цитированием
Старый 08.10.2016, 12:51   #2
Пепел Феникса
Модератор
Заслуженный модератор
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Адрес: Москва
Сообщений: 20,978
Репутация: 3384

icq: 446843180
skype: phoenix_proger
По умолчанию

а никак, вы обязаны дочитать.
просто WinInet это делает за вас.
__________________
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума   Ответить с цитированием
Старый 08.10.2016, 13:04   #3
Hailov
Пользователь
 
Регистрация: 08.10.2016
Сообщений: 18
Репутация: 40
По умолчанию

То есть InternetReadFile - фикция? И читает из уже закачанного кеша? Я конечно предполагал, но наивно думал что ошибаюсь.
Итак, это точно?
Hailov вне форума   Ответить с цитированием
Старый 08.10.2016, 14:23   #4
Пепел Феникса
Модератор
Заслуженный модератор
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Адрес: Москва
Сообщений: 20,978
Репутация: 3384

icq: 446843180
skype: phoenix_proger
По умолчанию

какая фикция, вы о чем?
он читает из соединения, но скрывает от вас детали оного.
если надо дочитать старые данные, он это сделает без вашего участия.
__________________
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума   Ответить с цитированием
Старый 08.10.2016, 14:52   #5
Hailov
Пользователь
 
Регистрация: 08.10.2016
Сообщений: 18
Репутация: 40
По умолчанию

Как он может дочитать из соединения, если предположим, до окончательного чтения произошел второй запрос (асинхронно).
Получается, во втором запросе сначала кешируются данные недочитанного первого.
Hailov вне форума   Ответить с цитированием
Старый 08.10.2016, 15:18   #6
Пепел Феникса
Модератор
Заслуженный модератор
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Адрес: Москва
Сообщений: 20,978
Репутация: 3384

icq: 446843180
skype: phoenix_proger
По умолчанию

Цитата:
Как он может дочитать из соединения, если предположим, до окончательного чтения произошел второй запрос (асинхронно
второй запрос идет в очередь.
Цитата:
Получается, во втором запросе сначала кешируются данные недочитанного первого.
если несколько запросов в одном соединении то просто идет очередь и все.
__________________
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума   Ответить с цитированием
Старый 08.10.2016, 15:23   #7
Hailov
Пользователь
 
Регистрация: 08.10.2016
Сообщений: 18
Репутация: 40
По умолчанию

Да, я понял, спасибо большое. Помогли разобраться.
Hailov вне форума   Ответить с цитированием
Ответ



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Одно значение на несколько input L6go1as HTML и CSS 4 27.03.2015 14:39
Соединение 2-х запросов moroz11 SQL, базы данных 3 03.06.2013 12:58
несколько запросов в БД SkrudjMakdak PHP 9 12.08.2011 11:38
Несколько запросов к БД artemavd БД в Delphi 8 15.09.2010 08:42
Одно Popupmunu на несколько TollButons akaTemporary Общие вопросы Delphi 11 21.01.2010 14:59




13:29.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru