Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Собрание лекций.doc
Скачиваний:
1
Добавлен:
14.08.2019
Размер:
864.77 Кб
Скачать

1. Сокеты

  • Сокет -коммуникационный узел (коммуникационный домен) – набор х-к взаимодействия TCP/IP протокол.

Типы сокетов:

  1. Сокет датаграмм (доступ к протоколу UDP)

  1. Сокет потока(TCP)-надежная передача потока байт без сохранения границ сообщения

  1. Сокет пакетов- надежная послед. Передача данных с сохранением границ сообщения

  1. Сокет низкого уровня(«Сырые» сокеты) –непосредственный доступ к коммуникационному протоколу

# include<sys/types.h>

# include<sys/types.h>

Int socket (int domain, int type, int protocol)

Коммуникационный домен

AF_UNIX –межпроцессорное взаимодействие в рамках одного хоста

D a

R m

E i

S l

S y

AF_NET – удаленные системы

PF_... PF=AF (PF – protocol family)

Тип сокета:

SOCK_DGRAM в UNIX, INET

(использует UDP)

SOCK_STREAM (TCP) в UNIX, INET

SOCK_RAW (IP) только в INET

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

  1. Коммутационный протокол

  2. Локальный адрес хоста IP

  3. Локальный процесс Порты

  4. Удаленный адрес хоста IP

  5. Удаленный процесс Порт

Для связывания сокета с его параметрами:

Системный вызов: int bind (int socfd, struct sockaddr * lockaddr, int addlen);

struct sockaddr { struct sockaddr_un {

u_short sa_family; short sun_family;

char sa_data; char sun_path[108];

}; };

структура данных общего вида UNIX

struct sockaddr_in {

short sin_family;

u_short sin_port;

struct in_addr sin_addr;

char sin_zero[0];

};

INET

int connect (int sockfd, struct sockaddr* servaddr, int addrlen);

Где sockfd дескриптор сокета клиента

TCP – с предварительной доставкой соединения и надёжной передачей сообщений. Чтобы передавать информацию по TCP, используется системный вызов connect.

Для UDP connect использовать не надо.

В UDP отправка сообщения осуществляется в никуда.

Системный вызов со стороны сервера:

Серверный системный вызов:

  1. int listen (int sockfd, int bscklog);

задание параметра очереди соединения

  1. int accept (int sockfd, ctuct sockaddr* claddr, int* addrlen);

предназначен для выполнения большого количества соединений

Создаёт новый socket, характеристики которого не отличаются от сокета указанного в качестве первого параметра.

Последовательность системных вызовов для сервера.

sockfd = socket (…);

bind (sockfd, … );

listen (sockfd, … );

for ( ; ; )

{

new sock = accept (sockfd, … );

if (fork == 0 )

{

close (sockfd);

exit(0);

}

else

close(new sockfd);

}

Вызовы для передачи и получения информации

  1. int send (int sockfd, const char* msg, int len, int flags);

  2. int sendto (int sockfd, const char* msg, int len, int flags,

const struct sockaddr* toaddr, int tolen);

1, 2. Флаги: MSG_OOB, MSG_PEEK.

Данный системный вызов используется только для сокетов типа socket stream, реализующих протокол TCP.

  1. int recv (int sockfd, char* buf, int len, int flags);

  2. int recvfrom (int sockfd, char* buf, int len, int flags,

struct sockaddr* fromaddr, int fromlen);

2 порядка следования байт:

сетевой,

серверный.

21429635 ─ 0х С5 57 В3

Адрес 00 01 02 03 обратный

Данные 0С С5 57 В3 сетевой

В3 57 С5 0С прямой (серверный порядок следования байт)

Для преобразования номеров портов используются следующие функции:

htons – host → net для short int

htonl – host → net для long int

ntohs – net → host для short int

ntohl – net → host для long int

Функции преобразования IP-адресов:

  1. inet_aton (char* addr, struct sockaddr­_in, sin_addr* addr_in);

  2. inet_ntoa ( - || - ) преобразует двоичный IP-адрес в символьное представление.

gethostbyname (“www.mail.ru”) - Получать IP-адрес на основе доменного имени.

Системные вызовы:

write (int fd, const void x buf, size_t const);

read (int fd, const void x buf, size_t const).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]