UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
13 Write(sockfd, "5", 1);14 printf("wrote 1 byte of normal datan");15 exit(0);16 }Листинг 24.7. Принимающая программа, в которой вызывается функция sokatmark
//oob/tcprecv04.c 1 #include "unp.h" 2 int 3 main(int argc, char **argv) 4 { 5 int listenfd, connfd, n, on = 1; 6 char buff[100]; 7 if (argc == 2) 8 listenfd = Tcp_listen(NULL, argv[1], NULL); 9 else if (argc == 3)10 listenfd = Tcp_listen(argv[1], argv[2], NULL);11 else12 err_quit("usage- tcprecv04 [ <host> ] <port#>");13 Setsockopt(listenfd, SOL_SOCKET, SO_OOBINLINE, &on, sizeof(on));14 connfd = Accept(listenfd, NULL, NULL);15 sleep(5);16 for (;;) {17 if (Sockatmark(connfd))18 printf("at OOB markn");19 if ((n = Read(connfd, buff, sizeof(buff) - 1)) == 0) {20 printf("received EOFn");21 exit(0);22 }23 buff[n] = 0; /* завершающий нуль */24 printf("read %d bytes: %sn", n; buff);25 }26 }13SO_OOBINLINE14-15accept16-25readreadsockatmarkПосле выполнения этой программы мы получаем следующий результат:
freebsd4 % <b>tcprecv04 6666</b>read 3 bytes: 123at OOB markread 2 bytes: 45received EOFХотя принимающий TCP получил все посланные данные, первый вызов функции
readПример: дополнительные свойства внеполосных данных
Теперь мы покажем другой столь же простой пример, иллюстрирующий две дополнительные особенности внеполосных данных, о которых мы уже упоминали ранее.
1. TCP посылает уведомление об отправке внеполосных данных (их срочный указатель), даже если поток данных остановлен функциями управления потоком.
2. Принимающий процесс может получить уведомление о том, что отправитель отослал внеполосные данные (с помощью сигнала
SIGURGselectrecvMSG_OOBEWOULDBLOCKВ листинге 24.8 приведена программа отправки.
Листинг 24.8. Программа отправки
//oob/tcpsend05.c 1 #include "unp.h" 2 int 3 main(int argc, char **argv) 4 { 5 int sockfd, size; 6 char buff[16384]; 7 if (argc != 3) 8 err_quit("usage: tcpsend04 <host> <port#>"); 9 sockfd = Tcp_connect(argv[1], argv[2]);10 size = 32768;11 Setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &size, sizeof(size));12 Write(sockfd, buff, 16384);13 printf("wrote 16384 bytes of normal datan");14 sleep(5);15 Send(sockfd, "a", 1, MSG_OOB);16 printf("wrote 1 byte of OOB datan");17 Write(sockfd, buff, 1024);18 printf("wrote 1024 bytes of normal datan");
