Cgi скрипт на C++

Сейчас научимся создавать cgi скрипты на С++. Для этого нам понадобится Web сервер, желательно Apache ну и конечно VC++. Для начала создадим домен, в котором будем тестировать скрипт, лезь в директорию где установлен Apache, у меня это C:\WebServers, дальше в папке home создай папку с названием test.com. В test.com сделай еще две папки, www и cgi, не забудь создать текстовый файл error.log. В папку www помести файл index.html, примерно такого содержания:

<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=windows-1251">
<title>script</title>
</head>
<body bgcolor="black" text="#FF9933" link="blue" vlink="purple" alink="red">
<form action="http://www.test.com/cgi/CGIScriptElf.cgi" method=GET>Enter:
<input type=text maxlength=256 name=comment>
<input type=submit value=Go>
</form>
</body>
</html>

После запускай VC++, создавай новый проект Win32 Console Application и пиши следущее:

#include <windows.h>
#include <iostream>
using namespace std;
 
int main()
{
        char szName[1024];
        cout<<"Content-Type: text/html\n\n";
        cout<<"<HTML><HEAD><TITLE>Lazy_elf</TITLE></HEAD>\n";
        cout<<"<body bgcolor='black' text='#F2F2F2' link='#FF9900' vlink='#FF9900' alink='#FF9900'>\n";
        cout<<"<meta http-equiv='content-type' content='text/html; charset=windows-1251'>\n";
        cout<<"<p style='line-height:100%; margin-left:10%;' align='center'><span style='font-size:14pt;'>Cgi-скрипт на С++.</span></p>\n";
        cout<<"<p style='line-height:100%; margin-left:10%;'><a href=http://www.pagel.by.ru>www.pagel.by.ru</a> Code by Lazy_elf</p>\n";
        char comment[256];   
        if(GetEnvironmentVariable("QUERY_STRING",comment,256))
        {cout<<"<p style='line-height:100%; margin-left:10%;'>Вы ввели: "<<comment<<"</p>\n";}
////////////////////////////////////////////////////////////////////////////////////////////////////////        
        cout<<"<p style='line-height:100%; margin-left:10%;' align='left'><font color='#FF9933'>Данные о клиенте:</font></p>\n";
        if(GetEnvironmentVariable("HTTP_USER_AGENT",szName,1024))
        {cout<<"<p style='line-height:100%; margin-left:10%;' align='left'><font color='#00C800'>HTTP_USER_AGENT: </font>"<<szName<<"</p>\n";}
        if(GetEnvironmentVariable("HTTP_ACCEPT",szName,1024))
        {cout<<"<p style='line-height:100%; margin-left:10%;' align='left'><font color='#00C800'>HTTP_ACCEPT: </font>"<<szName<<"</p>\n";}
        if(GetEnvironmentVariable("HTTP_REFERER",szName,1024))
        {cout<<"<p style='line-height:100%; margin-left:10%;' align='left'><font color='#00C800'>HTTP_REFERER: </font>"<<szName<<"</p>\n";}
        if(GetEnvironmentVariable("HTTP_ACCEPT_ENCODING",szName,1024))
        {cout<<"<p style='line-height:100%; margin-left:10%;' align='left'><font color='#00C800'>HTTP_ACCEPT_ENCODING: </font>"<<szName<<"</p>\n";}
        if(GetEnvironmentVariable("HTTP_ACCEPT_LANGUAGE",szName,1024))
        {cout<<"<p style='line-height:100%; margin-left:10%;' align='left'><font color='#00C800'>HTTP_ACCEPT_LANGUAGE: </font>"<<szName<<"</p>\n";}
        if(GetEnvironmentVariable("HTTP_IF_MODIFIED_SINCE",szName,1024))
        {cout<<"<p style='line-height:100%; margin-left:10%;' align='left'><font color='#00C800'>HTTP_IF_MODIFIED_SINCE: </font>"<<szName<<"</p>\n";}
        if(GetEnvironmentVariable("HTTP_FROM",szName,1024))
        {cout<<"<p style='line-height:100%; margin-left:10%;' align='left'><font color='#00C800'>HTTP_FROM: </font>"<<szName<<"</p>\n";}
////////////////////////////////////////////////////////////////////////////////////////////////////////
        szName[0] = '\0';
        cout<<"<p style='line-height:100%; margin-left:10%;' align='left'><font color='#FF9933'>Данные о сервере:</font></p>\n";
        if(GetEnvironmentVariable("GATEWAY_INTERFACE",szName,1024))
        {cout<<"<p style='line-height:100%; margin-left:10%;' align='left'><font color='#00C800'>GATEWAY_INTERFACE: </font>"<<szName<<"</p>\n";}
        if(GetEnvironmentVariable("SERVER_NAME",szName,1024))
        {cout<<"<p style='line-height:100%; margin-left:10%;' align='left'><font color='#00C800'>SERVER_NAME: </font>"<<szName<<"</p>\n";}
        if(GetEnvironmentVariable("SERVER_PORT",szName,1024))
        {cout<<"<p style='line-height:100%; margin-left:10%;' align='left'><font color='#00C800'>SERVER_PORT: </font>"<<szName<<"</p>\n";}
        if(GetEnvironmentVariable("SERVER_PROTOCOL",szName,1024))
        {cout<<"<p style='line-height:100%; margin-left:10%;' align='left'><font color='#00C800'>SERVER_PROTOCOL: </font>"<<szName<<"</p>\n";}
        if(GetEnvironmentVariable("SERVER_SOFTWARE",szName,1024))
        {cout<<"<p style='line-height:100%; margin-left:10%;' align='left'><font color='#00C800'>SERVER_SOFTWARE: </font>"<<szName<<"</p>\n";}
////////////////////////////////////////////////////////////////////////////////////////////////////////
        szName[0] = '\0';
        cout<<"<p style='line-height:100%; margin-left:10%;' align='left'><font color='#FF9933'>Данные о запросе:</font></p>\n";
        if(GetEnvironmentVariable("AUTH_TYPE",szName,1024))
        {cout<<"<p style='line-height:100%; margin-left:10%;' align='left'><font color='#00C800'>AUTH_TYPE: </font>"<<szName<<"</p>\n";}
        if(GetEnvironmentVariable("CONTENT_FILE",szName,1024))
        {cout<<"<p style='line-height:100%; margin-left:10%;' align='left'><font color='#00C800'>CONTENT_FILE: </font>"<<szName<<"</p>\n";}
        if(GetEnvironmentVariable("CONTENT_LENGTH",szName,1024))
        {cout<<"<p style='line-height:100%; margin-left:10%;' align='left'><font color='#00C800'>CONTENT_LENGTH: </font>"<<szName<<"</p>\n";}
        if(GetEnvironmentVariable("CONTENT_TYPE",szName,1024))
        {cout<<"<p style='line-height:100%; margin-left:10%;' align='left'><font color='#00C800'>CONTENT_TYPE: </font>"<<szName<<"</p>\n";}
        if(GetEnvironmentVariable("PATH_INFO",szName,1024))
        {cout<<"<p style='line-height:100%; margin-left:10%;' align='left'><font color='#00C800'>PATH_INFO: </font>"<<szName<<"</p>\n";}
        if(GetEnvironmentVariable("PATH_TRANSLATED",szName,1024))
        {cout<<"<p style='line-height:100%; margin-left:10%;' align='left'><font color='#00C800'>PATH_TRANSLATED: </font>"<<szName<<"</p>\n";}
        //хм...
        if(GetEnvironmentVariable("REMOTE_ADDR",szName,1024))
        {cout<<"<p style='line-height:100%; margin-left:10%;' align='left'><font color='#00C800'>REMOTE_ADDR: </font>"<<szName<<"</p>\n";}
        if(GetEnvironmentVariable("REMOTE_HOST",szName,1024))
        {cout<<"<p style='line-height:100%; margin-left:10%;' align='left'><font color='#00C800'>REMOTE_HOST: </font>"<<szName<<"</p>\n";}
        if(GetEnvironmentVariable("REQUEST_METHOD",szName,1024))
        {cout<<"<p style='line-height:100%; margin-left:10%;' align='left'><font color='#00C800'>REQUEST_METHOD: </font>"<<szName<<"</p>\n";}
        if(GetEnvironmentVariable("REQUEST_LINE",szName,1024))
        {cout<<"<p style='line-height:100%; margin-left:10%;' align='left'><font color='#00C800'>REQUEST_LINE: </font>"<<szName<<"</p>\n";}
        if(GetEnvironmentVariable("SCRIPT_NAME",szName,1024))
        {cout<<"<p style='line-height:100%; margin-left:10%;' align='left'><font color='#00C800'>SCRIPT_NAME: </font>"<<szName<<"</p>\n";}
        cout<<"</BODY></HTML>\n";
        return 0;
}

Компилируй, у получившейся программы измени расширение на cgi или просто в настройках линкера (Project->Settings->Link) измени Output file name и помести готовый скрипт в папку cgi. Запускай Apache, потом какой-нибудь браузер, в строке адрес напиши http://www.test.com, должно появится следующее:
Cgi скрипт на C++

Введи в поле и нажми кнопку Go, появится новая страница созданная скриптом, на которой сможешь увидеть значения основных переменных. Для получения значения нам необходима API функция GetEnvironmentVariable.

DWORD GetEnvironmentVariable(
LPCTSTR lpName, — имя переменной;
LPTSTR lpBuffer, — указатель на буфер, куда будет записано значение;
DWORD nSize — размер буфера.
);