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

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

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

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

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

#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