Читаем Linux API. Исчерпывающее руководство полностью

1. Применение нашей функции inetListen() для создания слушающего сокета, listenFd, привязанного к универсальному IP-адресу и порту, чей номер указан в виде единственного аргумента командной строки (его можно задать в виде числа или имени службы). Аргумент len возвращает размер структуры с адресом для сокета текущего домена. Позже это значение передается в вызов malloc(), где на его основе выделяется буфер для хранения адреса сокета, полученного из вызовов getsockname() и getpeername().

2. Использование функции inetConnect() для создания второго сокета, connFd, с помощью которого сокету, созданному в предыдущем шаге, отправляется запрос на соединение.

3. Вызов accept() для слушающего сокета. В результате создается третий сокет, acceptFd, соединенный с сокетом, созданным на шаге 2.

4. Применение вызовов getsockname() и getpeername() для получения локального и удаленного адресов двух соединенных сокетов, connFd и acceptFd. После каждого из этих вызовов программа обращается к функции inetAddressStr() для преобразования адреса в формат, пригодный для печати.

5. Приостановка работы на несколько секунд, чтобы запустить утилиту netstat (описана в разделе 57.7) и подтвердить информацию об адресе сокета.

Пример выполнения этой программы показан в следующей сессии командной строки:

$ ./socknames 55555 &

getsockname(connFd): (localhost, 32835)

getsockname(acceptFd): (localhost, 55555)

getpeername(connFd): (localhost, 55555)

getpeername(acceptFd): (localhost, 32835)

[1] 8171

$ netstat — a | egrep '(Address|55555)'

Proto Recv-Q Send-Q Local Address Foreign Address State

tcp 0 0 *:55555 *:* LISTEN

tcp 0 0 localhost:32835 localhost:55555 ESTABLISHED

tcp 0 0 localhost:55555 localhost:32835 ESTABLISHED

Как видите, подключенный сокет (connFd) был привязан к динамическому порту под номером 32835. Команда netstat выводит сведения обо всех трех сокетах, созданных нашей программой, и позволяет проверить информацию о номерах портов двух соединенных сокетов, которые находятся в состоянии ESTABLISHED (описанном в подразделе 57.6.3).

Листинг 57.3. Использование вызовов getsockname() и getpeername()

sockets/socknames.c

#include "inet_sockets.h" /* Определяет наши функции для работы с сокетами */

#include "tlpi_hdr.h"

int

main(int argc, char *argv[])

{

int listenFd, acceptFd, connFd;

socklen_t len; /* Размер буфера с адресом сокета */

void *addr; /* Буфер для адреса сокета */

char addrStr[IS_ADDR_STR_LEN];

if (argc!= 2 || strcmp(argv[1], "-help") == 0)

usageErr("%s service\n", argv[0]);

listenFd = inetListen(argv[1], 5, &len);

if (listenFd == -1)

errExit("inetListen");

connFd = inetConnect(NULL, argv[1], SOCK_STREAM);

if (connFd == -1)

errExit("inetConnect");

acceptFd = accept(listenFd, NULL, NULL);

if (acceptFd == -1)

errExit("accept");

addr = malloc(len);

if (addr == NULL)

errExit("malloc");

if (getsockname(connFd, addr, &len) == -1)

errExit("getsockname");

printf("getsockname(connFd): %s\n",

inetAddressStr(addr, len, addrStr, IS_ADDR_STR_LEN));

if (getsockname(acceptFd, addr, &len) == -1)

errExit("getsockname");

printf("getsockname(acceptFd): %s\n",

inetAddressStr(addr, len, addrStr, IS_ADDR_STR_LEN));

if (getpeername(connFd, addr, &len) == -1)

errExit("getpeername");

printf("getpeername(connFd): %s\n",

inetAddressStr(addr, len, addrStr, IS_ADDR_STR_LEN));

if (getpeername(acceptFd, addr, &len) == -1)

errExit("getpeername");

printf("getpeername(acceptFd): %s\n",

inetAddressStr(addr, len, addrStr, IS_ADDR_STR_LEN));

sleep(30); /* Дает нам время для запуска netstat(8) */

exit(EXIT_SUCCESS);

}

sockets/socknames.c

57.6. Подробности реализации протокола TCP

Представление о некоторых особенностях работы протокола TCP поможет нам отлаживать приложения, основанные на потоковых сокетах, и в ряде случаев делать их более эффективными. В следующих разделах мы рассмотрим:

• формат TCP-сегментов;

• модель подтверждения в TCP;

• машину состояний протокола TCP;

• установку и разрыв TCP-соединений;

• состояние TIME_WAIT.

57.6.1. Формат TCP-сегментов

На рис. 57.2 показан формат TCP-сегмента, который передается между разными концами TCP-соединения. Данные поля означают следующее.

• Номер исходного порта — номер порта сокета-отправителя.

Номер конечного порта — номер порта сокета-получателя.

Порядковый номер — порядковый номер сегмента. Представляет собой сдвиг относительно первого байта в этом сегменте в рамках потока данных, передаваемого по соединению в заданном направлении (см. подраздел 54.6.3).

Номер подтверждения — если установлен бит ACK (см. ниже), то данное поле содержит порядковый номер следующего байта, который получатель ожидает принять от получателя.

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных