- •2.Опорная модель osi
- •2 Обзор программных средств
- •2.1 Аутентификация и авторизация. Система Kerberos
- •2.2 Установка и настройка протоколов сети
- •4 Классификация архитектур информационных приложений
- •2.1. Файл-серверные приложения
- •2.2. Клиент-серверные приложения
- •2.3. Intranet-приложения
- •2.4. Склады данных (DataWarehousing) и системы оперативной аналитической обработки данных
- •2.5. Интегрированные распределенные приложения
- •5 Файл-серверные приложения
- •3.1. Традиционные средства и методологии разработки файл-серверных приложений
- •3.1.1. Системы программирования и библиотеки
- •3.1.2. Средства и методы разработки приложений на основе субд на персональных компьютерах
- •3.2. Новые средства разработки файл-серверных приложений
- •3.2.1. Общая характеристика современных средств
- •3.2.2. Примеры новых подходов
- •3.2.2.1. Пакет ms Access
- •3.2.2.2. Система Visual FoxPro
- •3.2.2.3. Среда программирования ca-Visual Objects
- •3.3. Перенос файл-серверных приложений в среду клиент-сервер
- •3.3.1. Библиотеки доступа к базам данных
- •3.3.2. Протокол odbc и его реализации
- •3.3.3. Укрупнение приложений (Upsigsing)
- •3.4. Рекомендации по использованию инструментальных средств разработки файл-серверных приложений
- •6 Клиент-серверные приложения
- •7 Принципы работы архитектуры клиент-сервер
- •Частично децентрализованные (гибридные) сети
- •Пиринговая файлообменная сеть
- •Пиринговые сети распределённых вычислений
- •Пиринговые финансовые сети
- •Сети клиент/сервер
- •10 Intranet приложения
- •Intranet - корпоративная , но не публичная сеть
- •Intranet - это применение Web-технологии
- •Intranet - это архитектура клиент-сервер
- •Intranet - не панацея от всех бед
- •11 Организация адресации в интернете
- •4. Практическая часть.
- •Основы сокетов
- •Системные вызовы
- •Создание и уничтожение сокетов
- •Вызов connect
- •Отправка данных
- •Серверы
- •Локальные сокеты
- •Пример использования локальных сокетов
- •Internet-Domain сокеты
- •Пары сокетов
- •Основные конструкции языка Java
- •Библиотека классов языка Java
- •Общие сравнительные характеристики:
- •Вызов расширения isapi сервером www
- •Функция GetExtensionVersion
- •Функция HttpExtensionProc
- •Получение данных расширением isapi
- •Функция GetServerVariable
- •Функция ReadClient
- •Посылка данных расширением isapi
- •Функция WriteCilent
- •Функция ServerSupportFunction
- •Способы поиска в Интернете Три способа поиска в Интернете
- •Поисковые серверы
- •Язык запросов поисковой системы
- •Классификация вторжений
- •Физическая безопасность
- •Утилизация старых компьютеров
- •Программный доступ
- •Идентификация пользователей
- •Системные демоны и службы
- •Службы tcp/ip, которые иногда можно отключить
- •Образец политики корпоративной безопасности
Пример использования локальных сокетов
В листинге 5.10 представлена программа сервера, в которой создается локальный сокет и слушает запросы на соединения с сервером. При получении запроса на соединение, сервер читает текстовые сообщения, передаваемые через соединение и печатает их. Если одно из этих сообщений - "выход", программа сервера удаляет сокет и завершается. Программа socket-server предполагает, что путь к сокету передается через параметр командной строки.
Листинг 5.10 (socket-server.c)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
/* Чтение текста из сокета и вывод его на печать. Продолжение цикла до закрытия сокета.
* В качестве результата возвратит не ноль, если клиент передал сообщение "quit", иначе 0 */
int server (int client_socket)
{
while (1) {
int length;
char* text;
/* Сначала из сокета прочитать длину текстого сообщения. Если в качестве результата возвратиться 0,
то клиент закрыл соединение */
if (read (client_socket, &ength, sizeof (length)) == 0)
return 0;
/* выделить место в буфере для хранения текста */
text = (char*) malloc (length);
/* Чтение текста и распечатка */
read (client_socket, text, length);
printf ("%s\n", text);
/* Освободить буфер */
free (text);
/* Если от клиента поступило сообщение "quit", завершить работу */
if (!strcmp (text, "quit"))
return 1;
}
}
int main (int argc, char* const argv[])
{
const char* const socket_name = argv[1];
int socket_fd;
struct sockaddr_un name;
int client_sent_quit_message;
/* Создать сокет */
socket_fd = socket (PF_LOCAL, SOCK_STREAM, 0);
/* Определить что это сервер */
name.sun_family = AF_LOCAL;
strcpy (name.sun_path, socket_name);
bind (socket_fd, &name, SUN_LEN (&name));
/* Слушать (ожидать) соединения */
listen (socket_fd, 5);
/* Неоднократно принимать соединения, создавая для каждого клиента server().
Продолжать до получения от клиента сообщения "quit" */
do {
struct sockaddr_un client_name;
socklen_t client_name_len;
int client_socket_fd;
/* Принимать соединение */
client_socket_fd = accept (socket_fd, &client_name, &client_name_len);
client_sent_quit_message = server (client_socket_fd);
/* Закрыть соединение с нашей стороны */
close (client_socket_fd);
}
while (!client_sent_quit_message);
/* Удалить файл сокета */
close (socket_fd);
unlink (socket_name);
return 0;
}
Клиент-программа, представленная в листинге 5.11, соединяется с локальным сокетом и посылает сообщения. Путь к сокету и сообщения передаtтся через командную строку.
Листинг 5.11(socket-client.c)
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
/* Записать TEXT в сокет, переданный дескриптором файла SOCKET_FD */
void write_text (int socket_fd, const char* text)
{
/* Записать в строку количество байт, включая NUL-терминал */
int length = strlen (text) + 1;
write (socket_fd, &length, sizeof (length));
/* Записать строку */
write (socket_fd, text, length);
}
int main (int argc, char* const argv[])
{
const char* const socket_name = argv[1];
const char* const message = argv[2];
int socket_fd;
struct sockaddr_un name;
/* Создать сокет */
socket_fd = socket (PF_LOCAL, SOCK_STREAM, 0);
/* Сохранить имя сервера в адресе сокета */
name.sun_family = AF_LOCAL;
strcpy (name.sun_path, socket_name);
/* Соединиться с сокетом */
connect (socket_fd, &name, SUN_LEN (&name));
/* Записать текст командной строки в сокет */
write_text (socket_fd, message);
close (socket_fd);
return 0;
}
Перед передачей сообщения, посылается размер сообщения в байтах в качестве переменной length. Сервер сохраняет размер сообщения, для выделения памяти под сообщение. Чтобы выполнить этот пример, необходимо запустить сервер-программу в одном окне, определить путь к сокету.
Например, /tmp/socket .
% ./socket-server /tmp/socket
В другом окне запустить клиент-программу несколько раз, опеределяя один и тот же путь сокета и посылая клиенту сообщение:
% ./socket-client /tmp/socket "Hello, world."
% ./socket-client /tmp/socket "This is a test."
Сервер-программа получает и печатает эти сообщения. Для закрытия соединения, клиент посылает сообщение "quit":
% ./socket-client /tmp/socket "quit"
Сервер-программа завершена.