- •Министерство общего и профессионального о образовании рф
- •Санкт-Петербургский государственный электротехнический
- •Университет (лэти)
- •Взаимодействие сетевых приложений
- •Введение
- •1.2. Операции с сокетом
- •Int socket(int family, int type, int protocol).
- •Int bind(int fd, struct sockaddr *umyaddr, int addrlen),
- •Int uname(struct utsname * buf);
- •Int getpeername(int fd, struct sockaddr * umyaddr, int * usockaddr_len),
- •Int listen(int fd, int acklog),
- •Int write(int fd, char*ubuf, int len);
- •Int send(int fd, void * buff, int len, unsigned flags);
- •Int sendto(int fd, void * buff, int len, unsigned flags, struct sockaddr*addr, int addr_len);
- •Int read(int fd, char *ubuf, int size);
- •Int recv(int fd, void * buff, int len, unsigned flags);
- •Int recvfrom(int fd, void * buff, int len, unsigned flags, struct sockaddr * addr, int * addr_len).
- •Int select(int numfds, fd_set * readfds, fd_set*writefds, fd_set*exeptfds, struct timeval*timeout).
- •Int id_socket, res_select;
- •1.4 Задания к лабораторной работе 1
- •Лабораторная работа 2 построение серверных и клиентских программ с использованием компилятора rpcgen
- •2.1. Описание интерфейса удаленной процедуры
- •Void main (int argc, char* argv[])
- •Int имя_функции (caddr_t resp, struct sockaddr_in * server_addr);
- •Int prtnt_result(caddr_t out, struct sockaddr_in *s)
- •Void main( )
- •197376, С.-Петербург, ул. Проф. Попова, 5
Int имя_функции (caddr_t resp, struct sockaddr_in * server_addr);
Этой функции в параметре resp будет передан адрес возвращаемого значения, а в параметре server_addr - указатель на структуру, содержащую IP-адрес отвечающего узла. Таким образом, клиентская программа будет знать, от кого пришел ответ и каков результат этого ответа. После каждого вызова обслуживающей функции анализируется, возвращаемое его значение. Если оно равно 0, то читается следующий поступивший ответ и повторно вызывается обслуживающая функция. Когда все поступившие ответы будут прочитаны, а обслуживающая функция возвращает. 0 и требует дополнительных ответов, то производится новый широковещательный запрос ко всем узлам сети. Максимальное количество широковещательных запросов, генерируемых функцией clnt_broadcast, - шесть. Если пользовательская функция возвращает ненулевое значение, то функция clnt_broadcast завершает свою работу и возвращает значение RPC_SUCCESS.
-29-
Пример клиентской программы, в которой используется широковещательный запрос к удаленной процедуре CURRENT_TIME:
#include <stdio.h>
#include “current_time.h”
int resp_count; /* счетчик ответов */
/* обслуживающая функция */
Int prtnt_result(caddr_t out, struct sockaddr_in *s)
{
printf(“\n %s”, *((char**)out)); printf((“\n %s”, inet_ntoa(s->sin_addr)); if(resp_coount < 2 )
{
resp_count++;
return 0;
}
return 1;
Void main( )
{
char *pres; /* указатель на возвращаемое значение */
enum clnt_stat brc;
resp_count=0;
/*широковещательный запрос к удаленной процедуре CURRENT_TIME*/
brc_clnt_broadcast (CURRENT_TIMEPROG, CURRENT_TIMEVERS, (unsigned long) 1, (xdrproc_t)xdr_void, (caddr_t)0, (xdrproc_t) xdr_string, &pres , print_result); switch (brc)
{ case RPC_SUCCESS;
printf(“ пришли все ответы \n “);
break; case RPC_TIMEDOUT;
printf(“пришло ответ: %d\n”, resp_count);
break;
default;
print (“Ошибка широковещательный запросе \n”); break;
-30-
В этой программе ожидается три ответа от серверов. Для подсчета числа ответов используется глобальная переменная resp_count. Значение этой переменной увеличивается на 1 при выполнении обслуживающей функции, которая вызывается для каждого ответа. Обслуживающая функция выводит на экран время и дату, полученные от сервера, а также сетевой адрес сервера. После выполнения широковещательного запроса клиентская программа анализирует код возврата функции broadcast.
2.6. Задание к лабораторной работе 2
Разработать серверную и две клиентские программы, взаимодействующие между собой через механизм удаленных процедур. Серверная программа должна работать в режиме однократного запуска по протоколам tср и udp. В ней должна быть реализована функция, указанная в одном из вариантов задания. Если для удаленной процедуры необходимо передать несколько параметров, то они должны быть упакованы в структуру и переданы серверной функции как один аргумент. Первая клиентская программа должна обратиться к удаленной процедуре, запущенной на другой машине. Имя этой машины задается при запуске клиентской программы. Во второй клиентской программе должен быть использован широковещательный режим запроса уделенной процедуры. Перед ее запуском, необходимо запустить модуль с удаленной процедурой на нескольких машинах.
Варианты заданий:
1. Процедура, определяющая день недели, на который приходится указанная дата.
2. Процедура, упорядочивающая массив целых чисел по возрастанию.
3. Процедура, возвращающая список имен файлов в заданном каталоге сервера.
4. Процедура, возвращающая список пользователей, зарегистрированных на сервере.
5. Процедура, порождающая процесс и запускающая программу из заданного каталога сервера.
6. Процедура, записывающая сообщение в заданный файл.
7. Процедура, выполняющая суммирование двух векторов заданной размерности.
8. Процедура, вычисляющая сумму членов следующего ряда: f +х+2х+3х+…+
+nx .
9. Процедура перемножения двух матриц фиксированного размера.
10. Процедура, осуществляющая поиск заданного файла на сервере.
-31-
Содержание
Введение............................................................................................................................... 3
Лабораторная работа I. ВЗАИМОДЕЙСТВИЕ ПРОЦЕССОВ ЧЕРЕЗ СОКЕТЫ...3
1.1.Понятие сокета...........................................................................................3
1.2. Операции с сокетом.....................................................................................5
1.2.1. Открытие сокета............................................................................................6
1.2.2. Привязка сокета к сетевому адресу...................................................... 6
1.2.3. Подготовка сокета к созданию канала связи....................................... 8
1.2 4. Прием запросов на создание канала.................................................................... 8
1.2.5. Посылка запроса на создание канала..................................................... 9
1.2.6. Передача данных........................................................................................ 9
1.2.7. Прием данных............................................................................................. 10
1.2.8. Прерывание связи с сокетом............................................................................... 11
1.2.9. Закрытие сокета ................................................................................................... 11
1.2.10. Получение и установки параметров сокета .................................................. 11
1.2.11. Опрос сокетов........................................................................................... 12
1.3. Схемы установления связи и передачи данных через сокеты........................... 14
1.4. Задания к лабораторной работе 1........................................................................... 18
Лабораторная работа 2. ПОСТРОЕНИЕ СЕРВЕРНЫХ И КЛИЕНТСКИХ ПРОГРАММ С ИСПОЛЬЗОВАНИЕМ КОМПИЛЯТОРА RPCGEN........................ 18
2.1. Описание интерфейса удаленной процедуры ..................................................... 18
2.2. Построение заглушек для удаленной процедуры.................................................20
2.3. Разработка серверной функции .............................................................................. 24
2.4. Вызов удаленной процедуры в программе клиента............................................ 26
2.5. Широковещательный запрос клиента...................................................................27
2.6. Задание к лабораторной работе 2 ...........................................................................31
Редактор Э.К. Долгатов
Лицензия ЛР № 020617 от 24.06.98
Подписано в печать05.04.99 Форма 60x84 1/16. Бумага тип. № 2.
Печать офсетная. Усл. печ. л. 1,86. Уч.-изд. л. 2,0.
Тираж 150 экз. Заказ 56.
Иэдательско-полиграфический центр СПбГЭТУ(ЛЭТИ)