Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.10.2016, 10:55   #1
Hailov
Пользователь
 
Регистрация: 08.10.2016
Сообщений: 18
По умолчанию 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, 11:51   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

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

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

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

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

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

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


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Одно значение на несколько input L6go1as HTML и CSS 4 27.03.2015 13: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 13:59