Чат
Теперь рассмотрим функции работы с параметрами на стороне сервера, на примере двух программ
для реализации чата. Функции, которые пишут информацию непосредственно на сервер,
используется очень редко. Здесь мы рассматриваем программу чата, как учебный пример, чтобы
продемонстрировать функции чтения параметров. Почему это учебный пример и как правильно
написать чат см. главу Часть IV "Базы данных".
Основное назначение группы этих функций, именно читать информацию из конфигурационного
файла на сервере, а также работать с параметрами, которые сохраняются в базе данных.
Чат представляет из себя три html-файла, одну программу, которая показывает
последние 20 сообщений и одну программу, которая добавляет сообщения.
В действие чат смотрите chat.html.
Код главной html-страницы чата выглядит следующим образом:
<html>
<head>
<title>Chat</title>
</head>
<frameset rows="90%, 10%">
<frame src="chat_show.html">
<frame src="chat_add.html">
</frameset>
</html>
Страница состоит из двух фреймов.
В верхнем отображаются сообщения.
В нижнем их можно добавлять.
Показ сообщений - chat_show.html, обновляется каждые 30 секунд.
<html>
<meta http-equiv="refresh" content="30; url=chat_show.html">
<body>
<!--#include virtual="/cgi-bin/chat"-->
</body>
</html>
Добавление сообщения - chat_add.html
<html>
<body>
<form method=post action=/cgi-bin/chat_add>
Имя:<input type=text name=name maxlenght=10 size=10>
Сообщение:<input type=text name=msg maxlenght=80 size=50>
<input type=submit>
</form>
</body>
</html>
|
Чат устроен предельно просто. На сервере имеется 20 параметров с именами 0, 1, 2, 3 и т.д.
Значение каждого параметра есть некоторое сообщение чата. Когда добавляется новое сообщение, то
20-е сообщение исчезает, его место занимает 19-е, на место 19-го становится 18-е и т.д.,
на место нулевого - новое сообщение.
Программа для вывода текущих сообщений выглядит следующим образом.
#include <itcgi.h>
int main()
{
LString* str = CreateString();
char buf[128];
int i;
printf("Content-type: text/html\n\n");
// в цикле читаем параметры на стороне сервера
for(i=0;i<20;i++)
{
sprintf(buf, "%d", i);
//следующая функция читает из конфигурационного файла
// из секции chat i-й параметр
GetRCParam(0, "chat", buf, str);
printf("%s<br>\n", *str);
}
DeleteString(str);
return 0;
}
=======Makefile======
all: chat
chat: chat.c itcgi.a
gcc chat.c -L/usr/local/lib/mysql -I/usr/local/include/mysql \
-L/usr/local/lib -I/usr/local/include \
-o chat -lmysqlclient /usr/lib/itcgi.a -Wall -O3
strip chat
cp chat /www/members/cgi-bin/chat
//программа добавления сообщения в чат
//
//
#include <itcgi.h>
int main()
{
LString* name = CreateString();
LString* msg = CreateString();
LString* str = CreateString();
char buf[128];
int i;
// Считываем имя автора и само сообщение
GetParamByName("name", name);
GetParamByName("msg", msg);
// в цикле переписываем значения параметров
// i-й параметр принимает значение (i-1)-го параметра
//
for(i=20;i>1;i--)
{
sprintf(buf, "%d", i-2);
GetRCParam(0, "chat", buf, str);
sprintf(buf, "%d", i-1);
SetRCParam(0, "chat", buf, *str);
}
// на место 0-го параметра ставим только что полученное сообщение
sprintf(buf, "%s: %s", *name, *msg);
SetRCParam(0, "chat", "0", buf);
// возвращаемся на страницу, с которой была вызвана
// эта программа
printf("Location: %s\n\n", getenv("HTTP_REFERER"));
DeleteString(name);
DeleteString(msg);
DeleteString(str);
return 0;
}
======Makefile======
all: chat_add
chat_add: chat_add.c itcgi.a
gcc chat_add.c -L/usr/local/lib/mysql -I/usr/local/include/mysql \
-L/usr/local/lib -I/usr/local/include \
-o chat_add -lmysqlclient /usr/lib/itcgi.a -Wall -O3
strip chat_add
cp chat_add /www/members/cgi-bin/chat_add
|
|