Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка к лабораторным работам (рус).doc
Скачиваний:
3
Добавлен:
15.11.2018
Размер:
353.79 Кб
Скачать

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);