- •Разработка сетевых приложений
- •План
- •Сокеты (socket)
- •Поддержка всех типов протоколов
- •Домены сокетов
- •Семейства протоколов
- •Примеры семейств протоколов /usr/include/linux/socket.h
- •Типы сокетов домена Интернет
- •Функция socket()
- •Привязка сокета к сетевому адресу и порту
- •Функция bind()
- •Формат адреса для семейства протоколов Интернет
- •Порядок байт сети и локальной машины
- •Пример привязки адреса
- •Возможности получения адресов
- •Использование службы доменных имен
- •Режимы сокетов
- •Соединение сокетов
- •Функция connect()
- •Серверный сокет в режиме прослушивания (LISTEN)
- •Сокет в режиме приема входящих соединений (accept)
- •Прием и передача информации
- •Диаграмма работы с
- •Класс sock_1
- •Пример сервера
- •Пример клиента
- •Пример выполнения
- •Синхронное и асинхронное выполнение
- •Проверка наличия данных
- •Удаленные вызовы процедур
- •Extended data representation
- •Использование компилятора RPCGEN
- •Пример описания интерфейсов
- •Создание тела процедуры
- •Создание клиента
- •Компиляция клиента и сервера
- •Пример работы
- •CORBA
- •Процесс создания распределенной программы
- •Пример – описание интерфейса
- •Создание тела функции (test- skelimpl.c)
- •Создание сервера
- •Пример сервера (test- skelimpl.c)
- •Создание клиента (test_client.c)
- •Пример клиента
- •Компиляция сервера и клиента
- •Запуск клиента и сервера
- •Вопросы
Функция 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 – максимальное количество входных соединений, которые ожидают на прием