Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
os7.doc
Скачиваний:
0
Добавлен:
20.06.2023
Размер:
217.09 Кб
Скачать

7.5.2. Программные средства работы с сокетами

Сокеты являются фактическим стандартом взаимодействия систем через существующие сети TCP/IP. Они позволяют соединяться машинам, на которых выполняются разные операционные системы.

Так же как и ранее две системы, соединяющиеся через сокеты, будут выступать в качестве сервера и клиента.

Рассмотрим основные этапы создания соединения, обмена данными и разъединения в приложениях сервера и клиента.

Сервер. Создание соединения.

  1. Сокет создается вызовом:

SrvLstSock = socket(AF_INET, SOCK_STREAM, 0);

Где:

AF_INET – тип адреса;

SOCK_STREAM – тип транспорта, поток или дейтаграммы

  1. После создания сокета надо заполнить специальную структуру данных sockaddr, в которой указывается тип адреса, номер порта и IP-адрес.

struct sockaddr_in SrvLstAddr;

SrvLstAddr.sin_family = AF_INET;

SrvLstAddr.sin_port = htons(LocalPort);

SrvLstAddr.sin_addr.s_addr = htonl(INADDR_ANY);

  1. Далее созданный сокет привязывают к описанной структуре данных:

bind(SrvLstSock,(struct sockaddr*)&SrvLstAddr,sizeof(SrvLstAddr)));

  1. Следующим этапом является перевод сокета в состояние прослушивания:

listen(SrvLstSock, 1);

Функции передается число возможных подключений, в данном случае 1.

  1. Подключение клиента производится через функцию accept(), при этом создается экземпляр нового сокета, непосредственно работающего с клиентом, а старый сокет продолжает слушать новые запросы:

SrvrSock = accept(SrvLstSock,(struct sockaddr*)&SrvrAddr,&SrvrAddrLen);

Функция accept() приостанавливает выполнение программы (синхронная), поэтому ее лучше выполнить в отдельном потоке.

Клиент. Создание соединения.

  1. Клиент создает сокет аналогичным вызовом:

ClntSock = socket(AF_INET, SOCK_STREAM, 0);

  1. Затем заполняет структуру данных, указывая адрес и порт удаленного хоста:

struct sockaddr_in ClntSAddr;

ClntSAddr.sin_family = AF_INET;

ClntSAddr.sin_port = htons(RemotePort);

ClntSAddr.sin_addr.s_addr = inet_addr(RemoteHost);

  1. После этого клиент вызывает функцию соединения с удаленным хостом, которую лучше выполнять в цикле и в отдельном потоке:

while (SOCKET_ERROR == connect(ClntSock, (struct sockaddr*)&ClntSAddr, sizeof(ClntSAddr))){

}

Приведенная схема взаимодействия сервера и клиента при соединении позволяет сделать несущественной очередность загрузки приложений. То приложение, которое будет загружено первым, будет ждать загрузки второго приложения. После загрузки обоих приложений состоится соединение.

Обмен данными производится с помощью вызовов:

send(ClntSock, trnbuf, strlen(trnbuf), 0));//клиент посылает данные

recv(SrvrSock, recbuf, strlen(recbuf), 0);//сервер принимает данные

Поскольку данные функции синхронные, то их лучше вызывать в отдельных потоках, чтобы другие действия приложений выполнялись.

Для закрытия соединения надо вызвать функции:

shutdown(SrvrSock,2);//2 - запрет передачи и приема

closesocket(SrvrSock);//закрытие сокета

closesocket(SrvLstSock);//закрытие сокета

Соседние файлы в предмете Операционные системы