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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сокеты:как отправить http запрос и получить ответ? снова о них - сокетах 
:(
    Опции темы
KQT
Дата 29.2.2008, 19:17 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



... и все казалось бы просто! Создаю соединение:
Код

    char* hname = "www.ya.ru";
    hostent* hya;
    in_addr addrya;

    hya = gethostbyname(hname);
    memcpy ((char*)&addrya, hya->h_addr, hya->h_length);

    cout << "IP : "<< inet_ntoa(addrya) << endl;

    SOCKET sCl = socket(AF_INET, SOCK_STREAM, 0);

    if (sCl == INVALID_SOCKET) {
        cout << "Сокет-клинент не был создан!"<< endl;
        return 0;
    }

    sockaddr_in hnm;
    hnm.sin_family = AF_INET;
    hnm.sin_addr.s_addr = inet_addr(inet_ntoa(addrya));
    hnm.sin_port = htons(80);
               
    cout << "connect : "<< connect(sCl, (sockaddr*)&hnm, sizeof(hnm)) << endl;
 Коннектит!
Отправляю запрос:
Код

    char* request =
    "HEAD http://www.ya.ru/ HTTP 1.1\r\n"
    "Host: ya.ru\r\n"
    "\r\n";
    
    char response[1024];
    strset(response, 0);

    cout << "send : " << sendPk(sCl, request, (unsigned int)strlen(request)) <<endl;
    
    cout << "recv : " << recvPk(sCl, response, 1024) << endl;
с помощью фуекций sendPk и recvPk: 
Код

int sendPk(SOCKET sock, const void* pData, unsigned int nLength) {
    if (send(sock, (char*)&nLength, sizeof(int), 0) != sizeof(int))
        return -1;

    if (send(sock, (char*)pData, nLength, 0) != nLength)
        return -1;

    return nLength;
}

int WaitResponse(SOCKET sock, double sec) {
    fd_set fds;

    FD_ZERO(&fds);
    FD_SET(sock, &fds);

    timeval tv;

    tv.tv_sec = (unsigned long) sec;
    tv.tv_usec = (unsigned long)((sec - (unsigned long)sec) * 1000000);

    return select((int)sock + 1, &fds, NULL, NULL, sec < 0 ? NULL : &tv) == 1;
}

int recvPk(SOCKET sock, const void* pData, unsigned int nMaxLength) {
    unsigned int nLength, nTotalLength;
    int nRecieved;

    if (!WaitResponse(sock, -1)) {
        cout << "NoResp"<< endl;
        return -1;
    }

    if (recv(sock, (char*)&nLength, sizeof(int), 0) != sizeof(int)) {
        cout << "NoConn"<< endl;
        return -1;
    }

    for (nTotalLength = nLength; nLength > 0&& nMaxLength > 0;) {
        nRecieved = recv(sock, (char*)pData, (nLength <= nMaxLength) ? nLength
                : nMaxLength, 0);
        if (nRecieved > 0) {
            pData = ((char*)pData) + nRecieved;
            nMaxLength -= nRecieved;
            nLength -= nRecieved;
        }
    }

    if (nLength > 0) {
        char chSkipBuffer[1024];
        while (nLength > 0) {
            nRecieved = recv(sock, (char*)chSkipBuffer, (nLength <= sizeof(chSkipBuffer)) ?
            nLength : sizeof(chSkipBuffer), 0);
            if(nRecieved > 0)
            nLength -= nRecieved;
        }
    }

    return nTotalLength;
}
. Запрос посылается успешно (судя по отладочной печати), а вот в ответ лишь урчание модема... и тишина, тишина, тишина. По началу дула, что там - на том конце - никого нет, проверил - есть!.. Ответа нет.

Тем, кто дочитал до конца эту бомбу - спасибо. Буду премного благодарен если подскажите "как правильно".

Вечно ваш. КОТ.
PM   Вверх
leniviy
Дата 29.2.2008, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



надо для начала поставить у себя HTTP сервер и не париться с модемом smile
PM MAIL   Вверх
ptr
Дата 4.3.2008, 12:21 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

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



Поправь запрос на
Цитата

HEAD / HTTP/1.1[CRLF]
Host: ya.ru[CRLF]
[CRLF]

И проверь что у тебя прога не зависает при приеме данных.

Это сообщение отредактировал(а) ptr - 5.3.2008, 08:38


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




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


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

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