Файл: CGI-скрипт.docx

Добавлена: 15.02.2019

Просмотров: 306

Скачиваний: 7

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

ВЫСШЕГО ОБРАЗОВАНИЯ

«НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»


Кафедра вычислительной техники









ОТЧЕТ

ПО ЛАБОРАТОРНОЙ РАБОТЕ №5

«CGI-скрипт»

ПО ДИСЦИПЛИНЕ «WEB-ПРОГРАММИРОВАНИЕ»











Факультет: АВТФ Преподаватель: Новицкая Ю.В.


Группа: АВТ-412


Студенты:

Евтушенко Никита Сергеевич

Лазаревич Михаил Михайлович








Новосибирск 2017г.


Цель работы:

Получить практические навыки в написании и отладке CGI-скрипта на языке программирования, имеющем средства для работы с интерфейсом CGI.

Задание:

Вариант 6:

Необходимо разработать CGI-скрипт, реализующий некоторый тест (проверка словарного запаса иностранного языка), и два счетчика выполнения теста — общий счетчик, значение которого хранится на серверной стороне, и счетчик конкретного посетителя, значение которого хранится на клиентской стороне в виде cookie.

Тест должен содержать не менее трех вопросов с не менее чем тремя вариантами ответа на каждый вопрос.

Данные, введенные пользователем, пересылаются на серверную сторону, обрабатываются CGI-скриптом, который «на лету» формирует документ с результатами прохождения теста и новыми значениями счетчиков прохождения теста.

CGI-скрипт следует написать так, чтобы он мог принимать данные, присланные как методом GET, так и методом POST.


Порядок выполнения лабораторной работы:

  1. Для выполнения лабораторной работы установить и настроить web-сервер или воспользоваться программным комплексом Denwer (http://denwer.ru).

  2. Создать html-документ с формой.

  3. Написать CGI-скрипт в соответствии с заданным вариантом.

  4. Протестировать созданный CGI-скрипт (при тестировании использовать методы передачи данных GET и POST).

html-разметка созданного документа:

<!DOCTYPE html>

<html lang="ru">

<head>

<meta charset="utf-8" />

<title>Do you know English?</title>

<link rel="stylesheet" type="text/css" href="css/reset.css">

<link rel="stylesheet" type="text/css" href="css/main.css">

</head>

<body>

<div id="desk">

<h1 align="center">English test.</h1>

<form action=http://localhost/lab5/prog/Debug/prog.exe method=get>

<h3>I _____ a teacher.</h3>

<label><h3><input type="radio" name="question1" value="true" checked>am<Br></h3></label>

<label><h3><input type="radio" name="question1" value="false">are.<Br></h3></label>

<label><h3><input type="radio" name="question1" value="false">is<Br></h3></label>

<hr>

<h3>He _____ like basketball.</h3>

<label><h3><input type="radio" name="question2" value="false" checked>not<Br></h3></label>

<label><h3><input type="radio" name="question2" value="false">don't<Br></h3></label>

<label><h3><input type="radio" name="question2" value="true">doesn't<Br></h3></label>

<hr>

<h3>Переведите слово 'abrogate' на русский язык.</h3>

<label><h3><input type="radio" name="question3" value="false" checked>показывать слабость<Br></h3></label>

<label><h3><input type="radio" name="question3" value="true">отменять<Br></h3></label>

<label><h3><input type="radio" name="question3" value="false">ценить<Br></h3></label>

<h3><input type="submit" value="Let's do it!"></h3>

</form>

</div>

</body>

Документ сформированный CGI-скриптом:

#include "stdafx.h"

#include <fstream>

#include <iostream>

#include <string>

#include <stdlib.h>


int SaveServer() //Сохранение документа на стороне сервера.

{

std::string filename = "Hop_Servachok";

FILE *file = fopen(filename.c_str(), "rb+");

int counter = 1;

if (file == NULL)

{

file = fopen(filename.c_str(), "wb");

if (file == NULL)

{

return 0;

}

fwrite(&counter, sizeof(int), 1, file);

return counter;

}

fread(&counter, sizeof(int), 1, file);

fseek(file, 0, SEEK_SET);

counter++;

fwrite(&counter, sizeof(int), 1, file);

return counter;


}



int SaveCookie() //Сохранение документа на стороне клиента.

{

char *pt = getenv("HTTP_COOKIE");

int counter = 1;

if (pt)

{

std::string cookie = pt;

int k;

k = cookie.find("counter");

if (k >= 0)

{

k += 8;

std::string s = "";

while (k < cookie.length() && cookie[k] != ';'){

s.push_back(cookie[k]);

k++;

}

counter = stoi(s);

counter++;

}

}

std::cout << "Set-Cookie: counter=" << counter << ";\n";


return counter;

}


void main()

{

int result = 0; //Результат.

std::string s=""; //Строка.

int len = 0; //Длина строки.

int i = 0; //Номер символа.

int counter = SaveCookie();

std::cout << "Content-type: text/html\n\n";

std::string method = getenv("REQUEST_METHOD");

if (method[0] == 'G')

{

s = getenv("QUERY_STRING");

}

else

{

std::cin >> s;

}

len = s.length();

for (i = 0; s[i] != '='; i++) {}

if (s[i + 1] == 't') result++;

i++;

for (i; s[i] != '='; i++) {}

if (s[i + 1] == 't') result++;

i++;

for (i; s[i] != '='; i++) {}

if (s[i + 1] == 't') result++;

i++;

std::cout << "<!DOCTYPE html>" <<std::endl;

std::cout << "<html>" << std::endl;

std::cout << "<head>" << std::endl;

std::cout << "<title>Do you know English?</title>" << std::endl;

std::cout << "<link rel = \"stylesheet\" type = \"text/css\" href = \"css/reset.css\">" << std::endl;

std::cout << "<link rel = \"stylesheet\" type = \"text/css\" href = \"css/main.css\">" << std::endl;

std::cout << "</head>" << std::endl;

std::cout << "<body>" << std::endl;

std::cout << "<div id = \"desk\">" << std::endl;

std::cout << "<h1>Your result: " << result << "/3!</h1>" << std::endl;

std::cout << "<h1>Total Users: " << SaveServer() << ".</h1>" << std::endl;

std::cout << "<h1>Number of Passages: " << counter << ".</h1>" << std::endl;

if (result == 3)

{

std::cout << "<h4 align=\"center\">A++</h4>" << std::endl;

std::cout << "<h3 align=\"center\">Very good!</h3>" << std::endl;

}

else if (result == 2)

{

std::cout << "<h4 align=\"center\">B</h4>" << std::endl;

std::cout << "<h3 align=\"center\">Good!</h3>" << std::endl;

}

else if (result == 1)

{

std::cout << "<h4 align=\"center\">C</h4>" << std::endl;

std::cout << "<h3 align=\"center\">Normal!</h3>" << std::endl;

}

else if (result == 0)

{

std::cout << "<h4 align=\"center\">F</h4>" << std::endl;

std::cout << "<h3 align=\"center\">Very bad!</h3>" << std::endl;

}

std::cout << "</div>" << std::endl;

std::cout << "</body>" << std::endl;

}

Скриншоты html-документа для различных браузеров:

Скриншот исходного документа:


Скриншот документа, сформированный CGI-скриптом:


Выводы по работе:

Были изучены основы CGI, а также его возможности.