Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
124
Добавлен:
20.06.2014
Размер:
6.61 Mб
Скачать

42.Взаимодействие по сети. Понятие протокола. Семейства адресации и типы взаимодействия. Создание сокета в ос unix.

  1. Создание сокета в ОС UNIX. Работа с адресом сокета. Завершение работы сокета.

Создание сокета:

Int socket (int address_family, int type, int protocol);

Задает использование семейства адресации

AF_INET для взаимодействия по сети по средствам tcp/ip

AF_UNIX в рамках 1 машины, адрес сокета это имя файла.

Задает тип взаимодействия type : const, sock_stream, sock_dgram

Задает конкретный используемый протокол, корректно в параметре поставить 0

-1 ошибка, в случае успеха № файлового дескриптора, связанного с созданным сокетом.

Работа с адресом:

Int bind( int sockfd, struct sockaddr*addr( указывает на структуру, созд адрес), int addrlen); размер структуры адреса в байтах. Реально в качестве параметра addr будет использовать структуру которая зависит от использований семейства адресации. В семействах AF_INET использование struct sockaddr_in умеет хранить ip адрес+код, объявляется она со след полями sin_family семейство адресации = AF_INET, sin_part № порта в сетевом порядке байт, sin_addr задает ip адрес. В семействах AF_UNIX используется struct sockaddr_un sun_family; sun_path массив из 108 символов, в которую записывается строка имени файла. Вызов bind возвращает 0 в случае успеха, -1 ошибка. Существует множество ситауций ошибок ( ошибка в случае использовании привилегированного № порта 0..1023, если задействован порт, который уже использован. Программно обрабатывать ошибка от bind обязательно.

Завершение : int close(int fd);

Вы также можете запретить передачу данных в каком-то одном направлении, используя shutdown.

int shutdown(int sockfd, int how);

Параметр how может принимать одно из следующих значений:

* 0 - запретить чтение из сокета

* 1 - запретить запись в сокет

* 2 - запретить и то и другое

Хотя после вызова shutdown с параметром how, равным 2, вы больше не сможете использовать сокет для обмена данными, вам всё равно потребуется вызвать close, чтобы освободить связанные с ним системные ресурсы.

  1. Сокеты дейтаграммного типа.

Если bind не организован, то данные мб только отправляться. Int sendto(int s, const void*buf, int len, int flags, const struct sockaddr*to, socklen_t*tolen);

Int recvfrom(int s, const void*buf, int len, int flags, const struct sockaddr*from, socklen_t*fromlen);

Параметр s задает дескриптор сокетов, buf указывает на буфер, содержащий данные для передачи, либо для размещения принятых, len размер, flags используется для задания дополнительных опций (для норм работы поставить 0), в вызове sendto параметр to указывает на структуру, содержащую адрес сокета, на который необходимо отправить данные, адрес получателя сообщения (sockaddr_in для AF_INET, sockaddr_un для AF_UNIX) параметр to len равен размеру этой структуры. Параметр from указывает на структуру в которой нужно записать адрес отправителя, fromlen представляет собой указатель на переменную типа socklen_t. Причем передающая система вызовом кусмакщь в неее нужно занести размер адресной структуры. После вызова переменной содержащей количество байт, который вызывается в эту структуру в итоге записан.