Специфікація BTRON3 (Український переклад) | Специфікація ОС Sakamura BTRON / BTRON3
Повернутися до змісту розділу Графічної оболонки
Попередня сторінка: 3.10 Системний трей та сповіщення (Повернутися)

3.11 Менеджер мережі та TCP/IP (TCP/IP Manager Specification)

3.11.1 Огляд мережевого менеджера TCP/IP

Менеджер TCP/IP розширює операційну систему BTRON3 функціями мережевого зв'язку за протоколами стека TCP/IP (Transmission Control Protocol / Internet Protocol) у середовищах локальних (LAN) та глобальних (WAN) мереж.

Системний інтерфейс Менеджера TCP/IP побудований на концепції мережевих сокетів (Sockets API). Комунікація виконується через дескриптори сокетів, які відокремлені від дескрипторів звичайних файлів BTRON. Мережевий стек забезпечує міжпроцесний та міжмережевий обмін даними як у межах одного пристрою, так і між вузлами в мережі.

3.11.2 Константи та структури даних TCP/IP

□ Сімейства протоколів та адрес

#define PF_UNSPEC   0       /* Невизначене сімейство протоколів */
#define PF_INET     2       /* Мережевий стек TCP/IP та пов'язані протоколи */

#define AF_UNSPEC   0       /* Невизначене сімейство адрес */
#define AF_INET     2       /* Адреси Інтернет (IPv4) */

□ Типи сокетів

#define SOCK_STREAM 1       /* Потоковий сокет із встановленням з'єднання (TCP) */
#define SOCK_DGRAM  2       /* Датаграмний сокет без з'єднання (UDP) */
#define SOCK_RAW    3       /* Низькорівневий протокольний сокет (Raw IP) */

□ Опції сокетів setsockopt / getsockopt

#define SOL_SOCKET      0xffff      /* Опції рівня сокета */
#define IPPROTO_TCP     0x0001      /* Опції рівня TCP */
#define IPPROTO_IP      0x0002      /* Опції рівня IP */

#define SO_DEBUG        0x0001      /* Включити ведення налагоджувального журналу */
#define SO_REUSEADDR    0x0004      /* Дозволити повторне використання локальної адреси */
#define SO_KEEPALIVE    0x0008      /* Підтримувати з'єднання активним (Keep-Alive) */
#define SO_DONTROUTE    0x0010      /* Обходити стандартну маршрутизацію */
#define SO_BROADCAST    0x0020      /* Дозволити відправку широкомовних пакетів */
#define SO_LINGER       0x0080      /* Затримка закриття сокета при наявності даних */
#define SO_OOBINLINE    0x0100      /* Залишати позасмугові дані OOB у загальному потоці */
#define SO_SNDBUF       0x1001      /* Розмір буфера відправки */
#define SO_RCVBUF       0x1002      /* Розмір буфера прийому */
#define SO_ERROR        0x1007      /* Отримати код помилки та очистити */
#define SO_TYPE         0x1008      /* Отримати тип сокета */

#define TCP_MAXSEG      0x2000      /* Максимальний розмір сегмента MSS */
#define TCP_NODELAY     0x2001      /* Відключати алгоритм Нагля для негайної відправки */

#define IP_OPTIONS      0x0001      /* Опції заголовка IP */

□ Структури мережевих адрес

struct sockaddr {
    unsigned short sa_family;   /* Сімейство адрес AF_INET */
    char sa_data[14];           /* Байтний масив адреси */
};

struct in_addr {
    unsigned long s_addr;       /* 32-бітна мережева IP-адреса (Network Byte Order) */
};

struct sockaddr_in {
    short sin_family;           /* AF_INET */
    unsigned short sin_port;    /* Номер порту TCP/UDP */
    struct in_addr sin_addr;    /* IP-адреса */
    char sin_zero[8];           /* Заповнювальні байти */
};

struct iovec {
    char *iov_base;         /* Базова адреса буфера */
    int iov_len;            /* Довжина буфера у байтах */
};

struct msghdr {
    char *msg_name;         /* Адреса призначання/джерела */
    int msg_namelen;        /* Розмір структури адреси */
    struct iovec *msg_iov;  /* Масив вектора буферів */
    int msg_iovlen;         /* Кількість елементів у msg_iov */
    char *msg_accrights;    /* Права доступу */
    int msg_accrightslen;
};

struct hostent {
    char *h_name;           /* Канонічне ім'я хоста */
    char **h_aliases;       /* Список псевдонімів хоста */
    int h_addrtype;         /* Тип адреси (AF_INET) */
    int h_length;           /* Довжина адреси у байтах (4) */
    char **h_addr_list;     /* Список мережевих IP-адрес */
#define h_addr h_addr_list[0]
};

struct servent {
    char *s_name;           /* Канонічна назва служби */
    char **s_aliases;       /* Псевдоніми служби */
    int s_port;             /* Номер порту */
    char *s_proto;          /* Протокол (tcp/udp) */
};

struct linger {
    int l_onoff;            /* Прапорець включення затримки (0-off, 1-on) */
    int l_linger;           /* Час затримки у секундах */
};

#define FD_SETSIZE 256
typedef struct fd_set {
    int fds_bits[FD_SETSIZE/sizeof(int)];
} fd_set;

struct timeval {
    long tv_sec;            /* Секунди */
    long tv_usec;           /* Мікросекунди */
};

3.11.3 Мережеві коди помилок TCP/IP

#define EX_HOSTUNREACH  ((-401) << 16)   /* Вузол/хост недосяжний */
#define EX_TIMEDOUT     ((-402) << 16)   /* Перевищено час очікування TCP/IP */
#define EX_CONNABORTED  ((-403) << 16)   /* Мережеве з'єднання перервано */
#define EX_NOBUFS       ((-404) << 16)   /* Переповнення мережевих буферів */
#define EX_BADF         ((-405) << 16)   /* Недійсний дескриптор сокета */
#define EX_WOULDBLOCK   ((-407) << 16)   /* Операція заблокує неблокуючий сокет */
#define EX_MSGSIZE      ((-408) << 16)   /* Розмір повідомлення перевищує ліміт */
#define EX_DESTADDRREQ  ((-409) << 16)   /* Необхідно вказати адресу призначення */
#define EX_PROTOTYPE    ((-410) << 16)   /* Некоректний тип протоколу для сокета */
#define EX_NOPROTOOPT   ((-411) << 16)   /* Непідтримувана опція протоколу */
#define EX_PROTONOSUPPORT ((-412) << 16) /* Протокол не підтримується у системі */
#define EX_SOCKTNOSUPPORT ((-413) << 16) /* Тип сокета не підтримується */
#define EX_OPNOTSUPP    ((-414) << 16)   /* Операція не підтримується сокетом */
#define EX_PFNOSUPPORT  ((-415) << 16)   /* Сімейство протоколів не підтримується */
#define EX_AFNOSUPPORT  ((-416) << 16)   /* Сімейство адрес не підтримується */
#define EX_ADDRINUSE    ((-417) << 16)   /* Локальна адреса/порт вже використовується */
#define EX_ADDRNOTAVAIL ((-418) << 16)   /* Запитана адреса недоступна */
#define EX_NETDOWN      ((-419) << 16)   /* Мережевий інтерфейс відключений */
#define EX_NETUNREACH   ((-420) << 16)   /* Мережа недосяжна */
#define EX_NETRESET     ((-421) << 16)   /* Мережу скинуто віддаленим вузлом */
#define EX_CONNRESET    ((-422) << 16)   /* З'єднання скинуто віддаленим сокетом */
#define EX_ISCONN       ((-423) << 16)   /* Сокет вже підключений */
#define EX_NOTCONN      ((-424) << 16)   /* Сокет не має активного з'єднання */
#define EX_SHUTDOWN     ((-425) << 16)   /* Передача/прийом заборонені (Shutdown) */
#define EX_CONNREFUSED  ((-426) << 16)   /* З'єднання відхилено віддаленим хостом */
#define EX_HOSTDOWN     ((-427) << 16)   /* Віддалений хост вимкнений */
#define EX_ALREADY      ((-428) << 16)   /* Операція підключення вже виконується */
#define EX_INPROGRESS   ((-429) << 16)   /* Виконується неблокуюче підключення */

3.11.4 Системні виклики сокетів TCP/IP

so_start
Start TCP/IP Subsystem
Ініціалізація мережевої підсистеми TCP/IP

【Синтаксис / Прототип】

ERR     so_start(W arg)

【Параметри】

W   arg     Аргумент розширення ініціалізації

【Значення, що повертається】

= 0      Успішне виконання
< 0      Помилка (Код помилки)

【Детальний опис】

Ініціалізує комунікаційну підсистему TCP/IP для поточного процесу. Зазвичай викликається автоматично при першому сокетному системному виклику.

so_finish
Finish TCP/IP Subsystem
Завершення роботи підсистеми TCP/IP

【Синтаксис / Прототип】

ERR     so_finish(W arg)

【Параметри】

W   arg     Прапор завершення (0 — нормальне завершення)

【Значення, що повертається】

= 0      Успішне виконання
< 0      Помилка (Код помилки)

【Детальний опис】

Завершує роботу мережевого стека для процесу та вивільняє системні мережеві ресурси.

so_socket
Create Socket
Створення комунікаційного сокета

【Синтаксис / Прототип】

WERR    so_socket(W domain, W type, W protocol)

【Параметри】

W   domain      Мережевий домен (PF_INET)
W   type        Тип сокета (SOCK_STREAM, SOCK_DGRAM)
W   protocol    Специфічний протокол (IPPROTO_TCP, IPPROTO_UDP, ICMP)

【Значення, що повертається】

> 0      Успішне виконання (Дескриптор сокета s)
< 0      Помилка (Код помилки)

【Детальний опис】

Створює новий мережевий сокет у домені domain типу type та повертає його дескриптор s.

【Коди помилок】

EX_NOBUFS          : Переповнення системних мережевих буферів.
EX_PROTONOSUPPORT  : Непідтримуваний тип або протокол сокета.
so_bind
Bind Socket Name
Прив'язка локальної адреси та порту до сокета

【Синтаксис / Прототип】

ERR     so_bind(W s, struct sockaddr *nam, W namlen)

【Параметри】

W                s       Дескриптор сокета
struct sockaddr *nam     Вказівник на локальну адресу sockaddr_in
W                namlen  Довжина структури адреси у байтах

【Значення, що повертається】

= 0      Успішне виконання
< 0      Помилка (Код помилки)

【Детальний опис】

Прив'язує локальну IP-адресу та номер порту nam до сокета s.

【Коди помилок】

EX_ADR          : Неприпустима адреса вказівника nam.
EX_BADF         : Недійсний дескриптор сокета s.
EX_ADDRINUSE    : Запитаний порт вже використовується іншим сокетом.
EX_ADDRNOTAVAIL : Прив'язка до даної адреси недоступна.
so_listen
Listen for Incoming Connections
Переведення сокета в режим очікування з'єднань

【Синтаксис / Прототип】

ERR     so_listen(W s, W backlog)

【Параметри】

W   s       Дескриптор потокового сокета SOCK_STREAM
W   backlog Максимальна довжина черги очікуючих підключень

【Значення, що повертається】

= 0      Успішне виконання
< 0      Помилка (Код помилки)

【Детальний опис】

Переводить сокет s у стан прослуховування вхідних підключень із розміром черги backlog.

so_accept
Accept Connection
Прийняття вхідного мережевого з'єднання

【Синтаксис / Прототип】

WERR    so_accept(W s, struct sockaddr *nam, W *namlen)

【Параметри】

W                s       Дескриптор прослуховуваного сокета
struct sockaddr *nam     Буфер для збереження адреси підключеного клієнта (Вихід)
W               *namlen  Вказівник на розмір буфера адреси

【Значення, що повертається】

> 0      Успішне виконання (Новий дескриптор підключеного сокета)
< 0      Помилка (Код помилки)

【Детальний опис】

Приймає перше вхідне підключення з черги прослуховуваного сокета s, створює новий сокет для з'єднання та повертає його дескриптор.

so_connect
Initiate Connection
Встановлення підключення до віддаленого сокета

【Синтаксис / Прототип】

ERR     so_connect(W s, struct sockaddr *nam, W namlen)

【Параметри】

W                s       Дескриптор сокета
struct sockaddr *nam     Адреса віддаленого хоста та порту
W                namlen  Розмір структури адреси

【Значення, що повертається】

= 0      Успішне виконання
< 0      Помилка (Код помилки)

【Детальний опис】

Ініціалізує мережеве з'єднання для сокета s із віддаленим хостом за адресою nam.

so_send
Send Data to Socket
Відправка даних через сокет

【Синтаксис / Прототип】

WERR    so_send(W s, B *buf, W len, W flags)

【Параметри】

W   s       Дескриптор підключеного сокета
B  *buf     Буфер із даними для відправки
W   len     Довжина даних у байтах
W   flags   Прапорці передачі (MSG_OOB, MSG_DONTROUTE)

【Значення, що повертається】

>= 0     Успішне виконання (Кількість відправлених байтів)
< 0      Помилка (Код помилки)

【Детальний опис】

Передає len байтів даних із буфера buf через підключений сокет s.

so_recv
Receive Data from Socket
Прийом даних із сокета

【Синтаксис / Прототип】

WERR    so_recv(W s, B *buf, W len, W flags)

【Параметри】

W   s       Дескриптор підключеного сокета
B  *buf     Буфер для збереження отриманих даних (Вихід)
W   len     Максимальна кількість байтів для прийому
W   flags   Прапорці прийому (MSG_OOB, MSG_PEEK)

【Значення, що повертається】

>= 0     Успішне виконання (Кількість реально отриманих байтів)
< 0      Помилка (Код помилки)
so_close
Close Socket
Закриття сокета

【Синтаксис / Прототип】

ERR     so_close(W s)

【Параметри】

W   s       Дескриптор закриваного сокета

【Значення, що повертається】

= 0      Успішне виконання
< 0      Помилка (Код помилки)

【Детальний опис】

Закриває мережевий сокет s та розриває його мережеве з'єднання.

so_select
Select Synchronous I/O Multiplexing
Мультиплексування сокетів за станом читання/запису

【Синтаксис / Прототип】

WERR    so_select(W nfds, fd_set *rfds, fd_set *wfds, fd_set *efds, struct timeval *tmout)

【Параметри】

W               nfds    Максимальний дескриптор плюс 1
fd_set         *rfds    Маска сокетів для перевірки готовності до читання
fd_set         *wfds    Маска сокетів для перевірки готовності до запису
fd_set         *efds    Маска сокетів для перевірки виняткових умов
struct timeval *tmout   Таймаут очікування (NULL — нескінченно)

【Значення, що повертається】

> 0      Успішне виконання (Кількість готових сокетів)
= 0      Сплив таймаут
< 0      Помилка (Код помилки)

【Детальний опис】

Виконує синхронне мультиплексування I/O для наборів сокетів rfds, wfds, efds.

so_gethostbyname
Get Host Information by Name
Отримання мережевої адреси хоста за іменем DNS

【Синтаксис / Прототип】

ERR     so_gethostbyname(B *nam, struct hostent *hp, B *buf)

【Параметри】

B              *nam     Доменне ім'я хоста (наприклад, "btron.org")
struct hostent *hp      Буфер для збереження структури hostent (Вихід)
B              *buf     Допоміжний робочий буфер розміром HBUFLE

【Значення, що повертається】

= 0      Успішне виконання
< 0      Помилка (Код помилки)

【Детальний опис】

Виконує DNS-розподіл доменного імені nam та повертає мережеві IP-адреси хоста у структуру hp.

【Коди помилок】

EX_HOSTUNREACH  : Хост з вказаним іменем не знайдено.
EX_TIMEDOUT     : Перевищено час очікування відповіді DNS-сервера.
so_gethostname
Get Local Host Name
Отримання імені локального хоста

【Синтаксис / Прототип】

ERR     so_gethostname(B *name, W nlen)

【Параметри】

B   *name   Буфер для збереження імені хоста (Вихід)
W    nlen   Розмір буфера в байтах

【Значення, що повертається】

= 0      Успішне виконання
< 0      Помилка (Код помилки)

Повернутися до змісту специфікації BTRON3
Попередня сторінка: 3.10 Системний трей та сповіщення (Повернутися)