- •Методичні вказівки до лабораторних робіт по курсу "інтерфейси паралельного програмування "
- •Методичні вказівки до лабораторних робіт по курсу "інтерфейси паралельного програмування "
- •7091502 “Системне програмування”;
- •Общие положения
- •1. Управление процессами и потоками
- •1.3.2. Создание и завершение процесса
- •1.3.3. Создание и завершение потока Поток создается вызовом функции
- •1.3.4. Приостановка и возобновление потоков
- •1.3.5. Переключение потоков
- •1.3.6. Определение периодов выполнения потоков
- •1.3.7. Приоритеты потоков
- •1.4. Задание на лабораторную работу
- •1.5. Контрольные вопросы и задания
- •2. Объекты синхронизации потоков и процессов
- •2.3.2. Мьютексы
- •2.3.3. Семафоры
- •Программа завершает работу с семафором вызовом функции
- •2.3.4.События
- •2.3.5. Wait -функции
- •2.4. Задание на лабораторную работу
- •2.5. Контрольные вопросы и задания
- •3. Обмен данными между программами на основе объекта winsock
- •3.1. Цель работы
- •3.2. Указания по подготовке к выполнению лабораторной работы
- •3.3. Сущность работы
- •3.3.1. Сторона клиента.
- •3.3.2 Сторона сервера
- •3.4. Задание на лабораторную работу
- •4.5. Контрольные вопросы и задания
- •4. Интерфейс параллельного программирования
- •4.1. Цель работы
- •4.2. Указания по подготовке к выполнению лабораторной работы
- •4.3. Обзор темы работы
- •4.3.1. Mpi. Терминология и обозначения
- •4.3.2. Общие процедуры mpi
- •4.3.3. Прием/передача сообщений между отдельными процессами
- •4.3.4. Прием/передача сообщений без блокировки
- •4.3.5. Объединение запросов на взаимодействие
- •4.3.6. Совмещенные прием/передача сообщений
- •4.3.7. Коллективные взаимодействия процессов
- •4.3.8. Синхронизация процессов
- •4.3.9. Работа с группами процессов
- •4.4. Задание на лабораторную работу
- •Вариант 2
- •4.5. Контрольные вопросы и задания
- •5.4. Задание на лабораторную работу
- •5.5. Контрольные вопросы и задания
- •Список литературы
- •Содержание
3.3.2 Сторона сервера
Первые шаги программы - сервера аналогичны клиенту. Проходит активизация интерфейса при помощи функции WSAStartup, после чего создается "сокет – сервер" (функция socket). Его назначение – прослушивать сеть в поисках клиентов, которые захотят общаться с сервером. "Сокет-сервер" ассоциируется с конкретным адресом, для чего используется функция bind:
int bind( SOCKET s, const struct sockaddr * addr, int namelen );
где s – сокет, подключенный к серверу;
addr – адрес, назначаемый сокету при помощи структуры sockaddr;
namelen - размер структуры второго параметра функции (addr).
Структура, задающая адрес может быть двух типов:
struct sockaddr {
unsigned short sa_family;
char sa_data [14];
};
или
struct sockaddr_in {
short sin_family;
u_short sin_port;
IN_ADDR sin_addr;
char sin_zero[8];
};
В них указываются: параметр sin_family должен быть установлен в AF_INET, sa_data содержит прямой адрес, в sin_port заносится номер порта, - содержит сетевой адрес в байтовом виде, sin_zero[8] - пустая строка для сохранения размера структуры такого как у sockaddr.
Следующий пример демонстрирует применение описанной функции:
SOCKADDR_IN sAdr;
PHOSTENT pHost;
pHost=gethostbyname("localhost");
memcpy ((char FAR *)&(sAdr.sin_addr),pHost->h_addr,pHost->h_length);
sAdr.sin_port = htons(1050);
sAdr.sin_family = AF_INET;
if (bind (ServerSock,(PSOCKADDR) &sAdr,sizeof(sAdr)) == SOCKET_ERROR)
{
wsprintf (szError, TEXT("binding to the server failed. Error: %d"),WSAGetLastError ());
MessageBox (NULL, szError, TEXT("Error"), MB_OK);
closesocket (ServerSock);
return FALSE;
}
После выполнения этого шага, сокет необходимо перевести в режим "прослушивания". Находясь в данном режиме, сокет перехватывает все обращения к нему (для чего и был задан адрес и номер порта) от других сокетов - клиентов, - которые находятся на этом же либо другом компьютере и выполняют функцию connect. Перевод в режим прослушивания осуществляется функцией listen.
int listen( SOCKET s, int backlog);
где s – сокет, устанавливаемый в режим прослушивания;
backlog – максимальная длина очереди запросов на соединение от сокетов – клиентов.
Пример использования этой функции:
if (listen(ServerSock,5) == SOCKET_ERROR)
{
wsprintf (szError,TEXT("listing to the server failed. Error: %d"),WSAGetLastError ());
MessageBox (NULL, szError, TEXT("Listen Error"), MB_OK);
closesocket (ServerSock);
return FALSE;
}
На сокете в режиме прослушивания образуется очередь запросов от сокетов – клиентов. Для того, чтобы установить связь, необходимо в программе – сервере создать еще один сокет для установления связи с одним из клиентов. Данный сокет создается на основе запроса, хранимого в "сокете - сервере". Для этих целей служит функция accept.
SOCKET accept(SOCKET s, struct sockaddr * addr, int * addrlen);
где s – сокет в режиме прослушивания;
addr и addrlen- являются выходными параметрами функции, в которые соответственно записывается адрес и длина адреса сокета, который послал запрос на соединение.
Особенностью функции является то, что она прекращает выполнение только после того, как какой-либо из сокетов – клиентов найден. Результатом выполнения функции есть сокет, готовый для обмена данными с сокетом – клиентом. Ниже приводится пример использования этой функции:
SOCKADDR cAdr;
int size1=sizeof(cAdr);
ClientSock=accept(ServerSock,&cAdr,&size1);
Созданный сокет ClientSock может участвовать в обмене данными, который осуществляется рассмотренными выше функциями send и recv.
Завершение работы сокетов.
После завершения обмена данными все сокеты, участвующие в программе должны быть закрыты при помощи функции closesocket:
int closesocket( SOCKET s);