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


Автор: Hose 30.5.2006, 16:13
Приветствую.

Пишу cgi скрипт, который посылает HTTP запрос на сервер. Сам запрос состоит из вызова другого cgi скрипта. Первый скрипт дожен выдать ответ второго.
Пишу на C++ под unix. Пытался воспользоваться сторонними библиотеками для работы по HTTP, но не получилось. Решил реализовать через сокеты.

Вот код второго скрипта:

Код

#include "stdio.h"

int main(int argc,char** argv)
{
    printf("Content-type: text/html\n\n");
    printf("%s", argv[1]);
    return 0;
}

 


он просто возвращает то, что получил

посылаю серверу следующий запрос:

Код

GET /cgi-bin/answer.cgi?qwerty HTTP/1.0
Host: <тут имя хоста>
 


Запрос делаю при помощи Microsoft telnet.
Получаю, то что хочу.

Код

HTTP/1.1 200 OK
Date: Tue, 30 May 2006 11:19:59 GMT
Server: Apache/1.3.24 (Unix) AGAVA.Banners/1.10 rus/PL30.12
Cache-Control: max-age=86400
Expires: Thu, 01 Jan 1970 00:00:01 GMT
Connection: close
Content-Type: text/html; charset=koi8-r
Last-Modified: Tue, 30 May 2006 11:19:59 GMT

<куча рекламы>
qwerty
 



теперь хочу сделать это в своем скрипте через сокеты


Код

int main(int argc,char** argv)
{
    if(argc != 2)
        return -1;

    // формируем сообщение, которое будем посылать
    CreatMessage(..., Message);

    // узнаем параметры хоста(нам нужен его IP) 
    struct hostent *phe = gethostbyname(HOSTNAME);

    int sock;
    struct sockaddr_in addr;

    // создаем сокет
    sock = socket(AF_INET, SOCK_STREAM, 0);
    if(sock < 0)
    {
        return ReturnEmpty();
    }

    // задаем параметры конекта
    addr.sin_family = AF_INET;
    addr.sin_port = htons(PORT); // или любой другой порт...
    addr.sin_addr.s_addr = ((struct in_addr *)phe->h_addr_list[0])->s_addr;

    if(connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0)
    {
        return ReturnEmpty();
    }

    // посылаем запрос
    send(sock, Message.c_str(), Message.length(), 0);

    // получаем ответ
    recv(sock, buf, 12550, 0);
    
    printf("Content-type: text/html\n\n");
    printf(buf);

    close(sock);

    return 0;
}
 


функция CreatMessage формирует запрос, в точности совпадающий с запосом, который я делал через telnet

вызываю этот скрипт через тотже telnet
В результате

Код

HTTP/1.1 200 OK
Date: Tue, 30 May 2006 11:41:32 GMT
Server: Apache/1.3.24 (Unix) AGAVA.Banners/1.10 rus/PL30.12
Cache-Control: max-age=86400
Expires: Thu, 01 Jan 1970 00:00:01 GMT
Connection: close
Content-Type: text/html; charset=koi8-r
Last-Modified: Tue, 30 May 2006 11:41:47 GMT

<тут куча рекламы>

 HTTP/1.1 200 OK
 Date: Tue, 30 May 2006 11:31:10 GMT
 Server: Apache/1.3.24 (Unix) AGAVA.Banners/1.10 rus/PL30.12
 Cache-Control: max-age=86400
 Expires: Thu, 01 Jan 1970 00:00:01 GMT
 Connection: close
 Content-Type: text/html; charset=koi8-r
 Last-Modified: Tue, 30 May 2006 11:31:10 GMT
 



а где то, что выдает второй скрипт?("qwerty")
 

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