Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Судаков / Лекции / lec21_net.ppt
Скачиваний:
23
Добавлен:
20.03.2015
Размер:
103.42 Кб
Скачать

Функция bind()

int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);

Sockfd – сокет, который привязывается

my_addr – указатель на структуру данных адреса, зависящая от протокола

Addrlen – размер структуры (области памяти)

Формат адреса для семейства протоколов Интернет

struct sockaddr_in {

 

 

sa_family_t

sin_family;

/* address family: AF_INET */

u_int16_t

sin_port;

/* port in network byte order */

struct in_addr

sin_addr;

/* internet address */

};

 

 

/* Internet address. */

 

struct in_addr {

 

 

u_int32_t

s_addr;

/* address in network byte order */

};

 

 

Все числовые значения адресов должны быть в «сетевом порядке битов»

Порядок байт сети и локальной машины

Для передачи информации между машинами все представление данных должно быть одинаковым для всех машин

Разные аппаратные платформы по разному представляют целые числа

Необходимы функции преобразования сетевого порядка битов в порядок битов машины и наоборот

ntohs() – short от сетевого порядка к порядку хоста

ntohl() - long от сетевого порядка к порядку хоста

htons() - short от порядка хоста к сетевому порядку

htonl() - long от порядка хоста к сетевому порядку

Пример привязки адреса

struct sockaddr_in addr;

unsigned long ip_addr_host = 0x0A190511;

//10.25.5.11;

unsigned long ip_addr_net = htonl(ip_addr_host );

// 0x1105190A

unsigned short tcp_port_host=22;

// 0x0016

unsigned short tcp_port_net=htons(tcp_port_host);

//0x1600

addr.sin_family = AF_INET; addr.sin_port = tcp_port_net; addr.s_addr = ip_addr_net;

bind(sock_fd, &addr, sizeof(addr));

Возможности получения адресов

IP адрес машины

В сетевом порядке

Любой адрес машины

Константа INADDR_ANY

Преобразование строки в ip адрес

Функция inet_addr()

unsigned long xaddr = inet_addr (“10.25.0.11”);

Служба доменных имен

Преобразование имени машины в ip адрес

Использование службы доменных имен

дляstruct sockaddrполученияin addr; ip адреса

struct hostent *gethostbyname(const char *name);

struct hostent {

char

*h_name;

char

**h_aliases;

int

h_addrtype;

int

h_length;

char

**h_addr_list;

};

/* official name of host */ /* alias list */

/* host address type */ /* length of address */ /* list of addresses */

Пример

struct hostent *hp = gethostbyname(“cluster.univ.kiev.ua”);

memcpy ((char *) &addr.sin_addr, (char *) hp->h_addr, hp->h_length);

Режимы сокетов

Несоединенный сокет

Соединенный сокет

Сокет может отправлять данные тому сокету, с которым он соединен

Обязательно для передачи данных через сокеты ориентированные на соединение

Режим прослушивания

Сокет ожидает приема соединений

Обязательно для серверных сокетов, ориентированных на соединение

Режим приема соединения

Сокет в режиме прослушивания возвращает соединенный с клиентом сокет

Используется серверными сокетами

Соединение сокетов

Соединение – установление виртуального канала между двумя сокетами

Выполняет клиент

Для протоколов ориентированных на соединение – обязательно

После соединения можно передавать и принимать данные из сокета

Функция connect()

int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);

Соединяет указанный сокет с указанным адресом

sid – сокет

Addr – заполненная структура адреса len – размер структуры

connect(sid,(sockaddr*)&addr,len);

Серверный сокет в режиме прослушивания (LISTEN)

Сервер постоянно «слушает» на сетевые соединения

Используется специальный режим сокета LISTEN

Сокету должен быть назначен адрес

Должна быть вызвана функция listen()

int listen(int socket_fd, int max_backlog)

socket_fd – сокет, который переводится в режим прослушивания

max_backlog – максимальное количество входных соединений, которые ожидают на прием

Соседние файлы в папке Лекции