Скачиваний:
14
Добавлен:
01.05.2014
Размер:
317.44 Кб
Скачать

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

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

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

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

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

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

SrvLstSock = socket(AF_INET, SOCK_STREAM, 0);

Где:

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

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

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

struct sockaddr_in SrvLstAddr;

SrvLstAddr.sin_family = AF_INET;

SrvLstAddr.sin_port = htons(LocalPort);

SrvLstAddr.sin_addr.s_addr = htonl(INADDR_ANY);

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

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

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

listen(SrvLstSock, 1);

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

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

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

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

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

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

ClntSock = socket(AF_INET,SOCK_STREAM,0);

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

struct sockaddr_in ClntSAddr;

ClntSAddr.sin_family = AF_INET;

ClntSAddr.sin_port = htons(RemotePort);

ClntSAddr.sin_addr.s_addr = inet_addr(RemoteHost);

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

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);//закрытие сокета

Выводы

Здесь рассмотрены только базовые средства работы с сокетами. В реальной работающей программе необходимо учитывать множество тонкостей.

Соседние файлы в папке Материалы к курсу