Эффективное программирование TCP-IP




Совет 21. Подумайте, не сделать ли приложение событийно-управляемым (2) - часть 2


3    #define T1 3000  /* Ждать 3 с до первого АСК */

4    #define T2 5000  /* и 5 с до второго АСК. */

5    #define ACKSZ ( sizeof ( u_int32_t ) + 1 )

6    typedef struct /* Пакет данных. */

7    {

8    u_int32_t len; /* Длина признака и данных. */

9    u_int32_t cookie; /* Признак сообщения. */

10   char buf[ 128 ]; /* Сообщение. */

11   } packet_t;

12   typedef struct /* Структура сообщения. */

13   {

14   packet_t pkt;  /* Указатель на сохраненное сообщение.*/

15   int id; /* Идентификатор таймера. */

16   } msgrec_t;

17   static msgrec_t  mr[ MRSZ ];

18   static SOCKET s;

Объявления

5 Признак, включаемый в каждое сообщение, — это 32-разрядный порядковый номер сообщения. Подтверждение от удаленного хоста определяется как ASCII-символ АСК, за которым следует признак подтверждаемого сообщения. Поэтому константа ASCZ вычисляется как длина признака плюс 1.

6-11 Тип packet_t определяет структуру посылаемого пакета. Поскольку сообщения могут быть переменной длины, в каждый пакет включена длина сообщения. Удаленное приложение может использовать это поле для разбиения потока данных на отдельные записи (об этом шла речь в совете 6). Поле len - это общая длина самого сообщения и признака. Проблемы, связанные с упаковкой структур, рассматриваются в заме­чаниях после листинга 2.15.

12-16 Структура msgrec_t содержит структуру packet_t, посланную удаленному хосту. Пакет сохраняется на случай, если придется послать его повторно. Поле id - это идентификатор таймера, выступающего в роли таймера ретрансмиссии для этого сообщения.

17 С каждым неподтвержденным сообщением связана структура msgrec_t. Все они хранятся в массиве mr.

Теперь обратимся к функции main программы xout3 (листинг 3.19).

Листинг 3.19. Функция main программы xout3

1    int main( int argc, char **argv )

2    {

3    fd_set allreads;

4    fd_set readmask;

5    msgrec_t *mp;

6    int rc;

7    int mid;

8    int cnt = 0;

9    u_int32_t msgid = 0;

10   char ack[ ACKSZ ];

11  INIT();




Содержание  Назад  Вперед