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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с загрузкой сайта HTTP, recv() 
:(
    Опции темы
MenSem
Дата 8.8.2009, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



del

Это сообщение отредактировал(а) MenSem - 22.12.2010, 00:29
--------------------
PM MAIL   Вверх
REZiaMIX
Дата 8.8.2009, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Возможно в первом буфере идет редирект.



--------------------
user posted image
PM MAIL   Вверх
Олег2005
Дата 8.8.2009, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Эти строчки - не дают эффекта
 hEvent = CreateEvent(0,false,true,L"");
 WaitForSingleObject(hEvent,2000);
Какое событие взводит  hEvent в просигналенное состояние?
Далее:
так не пишут:
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
Надо или
sock = socket(AF_INET, SOCK_STREAM,IPPROTO_TCP);
или
sock = socket(AF_INET, SOCK_STREAM, 0);

Далее
recv() надо ставить в цикл до получения кода возврата 0 - признак конца отсылки всего файла с сервера.
У вас он выполняется однажды - и все.
Так тоже не пишут
addr.sin_addr.s_addr = htonl(INADDR_ANY);
этот адрес - все нули, а потому:
addr.sin_addr.s_addr = (INADDR_ANY);
И вообще это лишнее - далее вы заполняете поле адреса из gethostbyname()
PM MAIL WWW MSN   Вверх
MenSem
Дата 8.8.2009, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



del

Это сообщение отредактировал(а) MenSem - 22.12.2010, 00:29
--------------------
PM MAIL   Вверх
MenSem
Дата 8.8.2009, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



del

Это сообщение отредактировал(а) MenSem - 22.12.2010, 00:30
--------------------
PM MAIL   Вверх
Олег2005
Дата 9.8.2009, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(MenSem @  8.8.2009,  21:50 Найти цитируемый пост)
после создание hEvent=0x000001ac и после  WaitForSingleObject не меняется. Кстати WaitForSingleObject возвращает 0 

В этом и фишка - WaitForSingleObject просто выполняет роль таймаута
и возвращает скорее всего WAIT_TIMEOUT

Цитата(MenSem @  8.8.2009,  21:24 Найти цитируемый пост)
Можно подробней? кстати по моему если с первого раза загружать посылая куки, то тоже самое, а вообще вход успешно идет т.к. там меньше 1000 символов весь ответ

Цитата

я же говорю ставил, даже в цикле по 1 байту принимал,  все равно приходит только 2720 байт

Поясните - то 1000, то вы принимаете 2720 б

Далее - насчет цикла.
Вы может и крутили в цикле - но проверки возврата recv() на 0 я не вижу в коде

Сидеть на recv() надо до тех пор, пока не придет 0.
PM MAIL WWW MSN   Вверх
MenSem
Дата 9.8.2009, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



del

Это сообщение отредактировал(а) MenSem - 22.12.2010, 00:30
--------------------
PM MAIL   Вверх
Alca
Дата 10.8.2009, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

 т.к. recv возвращает -1 и WSAGetLastError возвращает 10054

Сразу возвращяет или через некторое время?


--------------------
PM WWW ICQ Skype Jabber   Вверх
MenSem
Дата 10.8.2009, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



del

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


Опытный
**


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

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



А вы не пытались расшифровать html-код, который вы получили - эти 2720 байтов?
Суть в том, что может быть серверу что-то не нравится в вашем запросе, он отправляет вам все время один и тот же ответ, после чего просто рвет соединение?
PM MAIL WWW MSN   Вверх
MenSem
Дата 10.8.2009, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



del

Это сообщение отредактировал(а) MenSem - 22.12.2010, 00:30
--------------------
PM MAIL   Вверх
Alca
Дата 10.8.2009, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

но recv() почему-то загружает только первые 2720 символов, не больше

Может сервак шлет пакетами по 2720 байт.

Попробуй так:
Код

char tb[1];
int i=0;
while(/*пока не найден признак конца ответа сервера*/)
{
rc = recv(sock,tb,1,0);
buffer[i++]=tb[0];
}

или так
Код

std::string CXTcpClientSocket::sRecvAll(INT iFlags, const std::string &csDelimiter) {   
    std::string  sRes      = "";
    INT          iRes      = etError;   
    const size_t cuiInSize = SOCKET_BUFF_SIZE;
    std::string  sIn(cuiInSize, '\0');

    //-------------------------------------
    //читаем из сокета блоками и пишем в строку
    for (;;) {   
        iRes = iRecv(&sIn[0], cuiInSize, iFlags);  
        if (etError == iRes) {
            break;
        }
        if (0 == iRes) {
            break;
        }    

        sRes.append(sIn.begin(), sIn.begin() + iRes);
        
        //если нашли разделитель, то выходим
        size_t uiDelimiterPos = std::string::npos;

        uiDelimiterPos = sRes.find(csDelimiter);
        if (std::string::npos != uiDelimiterPos) {
            break;
        }
    } 
    
    return sRes;  



Это сообщение отредактировал(а) Alca - 10.8.2009, 22:10


--------------------
PM WWW ICQ Skype Jabber   Вверх
MenSem
Дата 10.8.2009, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



del

Это сообщение отредактировал(а) MenSem - 22.12.2010, 00:31
--------------------
PM MAIL   Вверх
MenSem
Дата 11.8.2009, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



del

Это сообщение отредактировал(а) MenSem - 22.12.2010, 00:31
--------------------
PM MAIL   Вверх
Alca
Дата 11.8.2009, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

что за функция iRecv ?

врапер над ::recv


--------------------
PM WWW ICQ Skype Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




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


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

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