Вход/Регистрация
UNIX: разработка сетевых приложений
вернуться

Стивенс Уильям Ричард

Шрифт:

Листинг 24.1. Простая программа отправки внеполосных данных

//oob/tcpsend01.c

1 #include "unp.h"

2 int

3 main(int argc, char **argv)

4 {

5 int sockfd;

6 if (argc != 3)

7 err_quit("usage: tcpsend01 <host> <port#>");

8 sockfd = Tcp_connect(argv[1], argv[2]);

9 Write(sockfd, "123", 3);

10 printf("wrote 3 bytes of normal data\n");

11 sleep(1);

12 Send(sockfd, "4", 1, MSG_OOB);

13 printf("wrote 1 byte of OOB data\n");

14 sleep(1);

15 Write(sockfd, "56", 2);

16 printf("wrote 2 bytes of normal data\n");

17 sleep(1);

18 Send(sockfd, "7", 1, MSG_OOB);

19 printf("wrote 1 byte of OOB data\n");

20 sleep(1);

21 Write(sockfd, "89", 2);

22 printf("wrote 2 bytes of normal data\n");

23 sleep(1);

24 exit(0);

25 }

Отправлены 9 байт, промежуток между операциями по отправке установлен с помощью функции

sleep
равным одной секунде. Назначение этого промежутка в том, чтобы данные каждой из функций
write
или
send
были переданы и получены на другом конце как отдельный сегмент TCP. Несколько позже мы обсудим некоторые вопросы согласования во времени при пересылке внеполосных данных. После выполнения данной программы мы видим вполне предсказуемый результат:

macosx % tcpsend01 freebsd 9999

wrote 3 bytes of normal data

wrote 1 byte of OOB data

wrote 2 bytes of normal data

wrote 1 byte of OOB data

wrote 2 bytes of normal data

В листинге 24.2 показана принимающая программа.

Листинг 24.2. Простая программа для получения внеполосных данных

//oob/tcprecv01.c

1 #include "unp.h"

2 int listenfd, connfd;

3 void sig_urg(int);

4 int

5 main(int argc, char **argv)

6 {

7 int n;

8 char buff[100];

9 if (argc == 2)

10 listenfd = Tcp_listen(NULL, argv[1], NULL);

11 else if (argc == 3)

12 listenfd = Tcp_listen(argv[1], argv[2], NULL);

13 else

14 err_quit("usage: tcprecv01 [ <host> ] <port#>");

15 connfd = Accept(listenfd, NULL, NULL);

16 Signal(SIGURG, sig_urg);

17 Fcntl(connfd, F_SETOWN, getpid);

18 for (;;) {

19 if ((n = Read(connfd, buff, sizeof(buff) - 1)) == 0) {

20 printf("received EOF\n");

21 exit(0);

22 }

23 buff[n] = 0; /* завершающий нуль */

24 printf("read bytes: %s\n", n, buff);

25 }

26 }

27 void

  • Читать дальше
  • 1
  • ...
  • 336
  • 337
  • 338
  • 339
  • 340
  • 341
  • 342
  • 343
  • 344
  • 345
  • 346
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: