Корпоративные системы Лекция 3. Реализация архитектуры «Клиент- сервер» с использованием механизма сокетов
Использование сокетов (Sockets)
Использование сокетов в режиме установления соединения
Использование сокетов в режиме дейтаграмм
Создание сокета int socket (domain, type, protocol) int domain; int type; int protocol; domain задает используемый для взаимодействия набор протоколов: AF_INET – протокол TCP/IP; AF_UNIX – для работы в среде UNIX type задает режим взаимодействия: SOCK_STREAM - с установлением соединения; SOCK_DGRAM - без установления соединения. SOCK_RAW – доступ к протоколам низкого уровня protocol задает конкретный протокол транспортного уровня (из нескольких возможных в стеке протоколов). Если этот аргумент задан равным 0, то будет использован протокол "по умолчанию" (TCP для SOCK_STREAM и UDP для SOCK_DGRAM при использовании комплекта протоколов TCP/IP). Возвращаемое значение: При удачном завершении своей работы данная функция возвращает дескриптор socket'а - целое неотрицательное число, однозначно его идентифицирующее. При обнаружении ошибки в ходе своей работы функция возвращает число "-1".
Связывание сокета int bind (s, addr, addrlen) int s; struct sockaddr *addr; int addrlen; S задает дескриптор связываемого сокета addr указывает на структуру данных, содержащую локальный адрес, приписываемый сокету. Для TCP/IP такой структурой является: struct sockaddr_in { short sin_family; // используемый формат адреса(AF_INET) u_short sin_port; // номер порта struct in_addr sin_addr; // IP-адрес узла char sin_zero[8]; // не используется }; addrlen - размер структуры в байтах Возвращаемое значение: В случае успеха bind возвращает 0, в противном случае - "-1".
Установка соединения int connect (s, addr, addrlen) int s; struct sockaddr_in *addr; int addrlen; S задает дескриптор сокета (д.б. заранее обеспечен адресом с помощью вызова bind) addr указатель на структуру данных sockaddr_in, которая описывает параметры сокета программы-сервера. Для этого можно пользоваться функцией gethostbyname() struct hostent *gethostbyname (name) char *name; name – доменное имя узла сети struct hostent – структура имеющая следующий вид struct hostent { char *h_name; // Основное имя узла char **h_aliases; // Список дополнительных имен int h_addrtype; // для TCP/IP – AF_INET int h_lenght; // Длина адреса узла char *h_addr; // Указатель на область памяти, сод. }; // имя адреса узла addrlen - размер структуры в байтах Возвращаемое значение: При успешном выполнении запроса системный вызов connect возвращает 0, в противном случае - "-1"
Отправка данных int send (s, buf, len) int s; char *buf; int len; int flags; S задает дескриптор сокета buf - указатель на область памяти, содержащую передаваемые данные len - размер структуры в байтах flags - модифицирует исполнение системного вызова send, если равно 0, то вызов полностью аналогичен системному вызову write. Возвращаемое значение: При успешном завершении send возвращает количество переданных из области, указанной аргументом buf, байт данных. Если канал данных, определяемый дескриптором s, оказывается "переполненным", то send переводит программу в состояние ожидания до момента его освобождения.
Чтение данных int recv (s, buf, len) int s; char *buf; int len; int flags; S задает дескриптор сокета buf - указатель на область памяти, содержащую передаваемые данные len - размер структуры в байтах flags - модифицирует исполнение системного вызова recv, если равно 0, то вызов полностью аналогичен системному вызову read. Возвращаемое значение: При успешном завершении recv возвращает количество принятых в область, указанную аргументом buf, байт данных. Если канал данных, определяемый дескриптором s, оказывается "пустым", то recv переводит программу в состояние ожидания до момента появления в нем данных.
Закрытие соединения Нормальное завершение работы: int close (s) int s; S задает дескриптор сокета Возвращаемое значение: При успешном завершении 0, иначе -1 Экстренное завершение работы: int shutdown (s, how) int s; int how; S задает дескриптор сокета how задает действия, выполняемые при очистке системных буферов сокета 0 - сбросить и далее не принимать данные для чтения из сокета; 1 - сбросить и далее не отправлять данные для посылки через сокет; 2 - сбросить все данные, передаваемые через сокет в любом направлении. Возвращаемое значение: При успешном завершении 0, иначе -1
Классы для работы с сокетами от Borland Компонент TServerSocket (закладка Internet) Компонент TClientSocket (закладка Internet)
Компонент ТServerSocket СвойстваМетодыСобытия Socket ServerType ThreadCacheSize Active Port Service Open Close OnClientConnect OnClientDisconnect OnClientError OnClientRead OnClientWrite OnGetThread OnThreadStart OnThreadEnd OnAccept OnListen
TServerSocket.Socket ActiveConnections (Integer) - количество подключенных клиентов; ActiveThreads (Integеr) - количество работающих процессов; Connections (array) - массив, состоящий из отдельных классов TClientWinSocket для каждого подключенного клиента. Например, такая команда: ServerSocket1.Socket.Connections[0].SendText('Hello!'); отсылает первому подключенному клиенту сообщение 'Hello!'. Команды для работы с элементами этого массива - также (Send/Receive)(Text,Buffer, Stream); IdleThreads (Integer) - количество свободных процессов. Такие процессы кэшируются сервером (см. ThreadCacheSize); LocalAddress, LocalHost, LocalPort - соответственно - локальный IP- адрес, хост-имя, порт; RemoteAddress, RemoteHost, RemotePort - соответственно - удаленный IP-адрес, хост-имя, порт; Методы Lock и UnLock - соответственно, блокировка и разблокировка сокета.