Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Сетевые сокеты

.pdf
Скачиваний:
21
Добавлен:
22.03.2016
Размер:
121.77 Кб
Скачать

Обмен данными

● Двунаправленный обмен данными

#include <sys/socket.h>

int shutdown(int sockfd, int how);

SHUT_RD

SHUT_WR

SHUT_RDWR

Сторона сервера

У каждого сокета должен быть адрес (как у клиента так и у сервера)

Дла сокетов в домене AF_INET (IPv4) адрес:

[ip_adress] + [port]

8.8.8.8:53

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

#include <sys/socket.h>

int bind(int sockfd, const struct sockaddr *addr, socklen_t len);

Возвращает 0 в случае успеха, –1 в случае ошибки

Ограничения

Указываемый адрес должен быть действительным адресом для машины, на которой выполняется процесс – мы не можем задать адрес, который принадлежит другой машине.

Формат адреса должен совпадать с форматом, который поддерживается семейством адресов, указанным при создании сокета.

Номер порта не может быть меньше 1024, если процесс не имеет соответствующих привилегий (например, привилегий суперпользователя).

Обычно каждый конкретный адрес может быть связан только с одним сокетом

Задание адреса

Для каждого домена определен свой формат представления адреса. AF_INET:

struct in_addr {

in_addr_t s_addr; /* адрес IPv4 */

};

struct sockaddr_in {

sa_family_t sin_family; /* семейство адресов */ in_port_t sin_port; /* номер порта */ struct in_addr sin_addr; /* адрес IPv4 */

};

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

include <arpa/inet.h>

Преобразование текстового адреса в числовой int inet_pton(int af, const char *src, void *dst);

Обратное преобразование

const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);

Пример

inet_pton.c

Преобразование портов

#include <arpa/inet.h>

uint16_t htons(uint16_t hostint16);

Возвращает 16-битное целое с сетевым порядком байтов

Обратное преобразование

#include <arpa/inet.h>

uint16_t ntohs(uint16_t netint16);

Возвращает 16 битное целое с аппаратным порядком байтов

Прослушивание всех сетевых интерфейсов

Специальный адрес: INADDR_ANY