Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > Проблема с загрузкой сайта HTTP


Автор: MenSem 8.8.2009, 17:15
del

Автор: REZiaMIX 8.8.2009, 17:35
Возможно в первом буфере идет редирект.

Автор: Олег2005 8.8.2009, 22:24
Эти строчки - не дают эффекта
 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()

Автор: MenSem 8.8.2009, 22:24
del

Автор: MenSem 8.8.2009, 22:50
del

Автор: Олег2005 9.8.2009, 20:54
Цитата(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.

Автор: MenSem 9.8.2009, 22:43
del

Автор: Alca 10.8.2009, 12:25
Цитата

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

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

Автор: MenSem 10.8.2009, 13:40
del

Автор: Олег2005 10.8.2009, 20:30
А вы не пытались расшифровать html-код, который вы получили - эти 2720 байтов?
Суть в том, что может быть серверу что-то не нравится в вашем запросе, он отправляет вам все время один и тот же ответ, после чего просто рвет соединение?

Автор: MenSem 10.8.2009, 21:07
del

Автор: Alca 10.8.2009, 22:09
Цитата

но 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;  


Автор: MenSem 10.8.2009, 22:57
del

Автор: MenSem 11.8.2009, 21:39
del

Автор: Alca 11.8.2009, 21:54
Цитата

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

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

Автор: Олег2005 11.8.2009, 22:07
Цитата(MenSem @  10.8.2009,  20:07 Найти цитируемый пост)
в каком смысле расшифровать? 

Ну конечно не в смысле расшифровки шифрования smile 
Просто прочитать то, что прислал сервер - просмотреть html файл и понять, что он означает - и что дополнительно шлет сервер - т.е. заголовки ответа сервера.

Автор: MenSem 12.8.2009, 10:49
del

Автор: Олег2005 12.8.2009, 21:54
Заголовки ответа сервера как вы прочли? 
Можете их воспроизвести?

Автор: MenSem 14.8.2009, 18:06
del

Автор: Олег2005 14.8.2009, 18:43
В общем, у меня такое подозрение, что серверу что-то не нравилось - и он обрывал соединение.
Попробуйте вашу программу с другими сайтами.......

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)