Приветствую.
Пишу 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") |