UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
11 if (argc != 3)12 err_quit("usage: sendrecv <IP-multicast-address> <port#>");13 sendfd = Udp_client(argv[1], argv[2], (void**)&sasend, &salen);14 recvfd = Socket(sasend->sa_family, SOCK_DGRAM, 0);15 Setsockopt(recvfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));16 sarecv = Malloc(salen);17 memcpy(sarecv, sasend, salen);18 Bind(recvfd, sarecv, salen);19 Mcast_join(recvfd, sasend, salen, NULL, 0);20 Mcast_set_loop(sendfd, 0);21 if (Fork() == 0)22 recv_all(recvfd, salen); /* дочерний процесс -> получение */23 send_all(sendfd, sasend, salen); /* родитель -> отправка */24 }Мы создаем два сокета, один для отправки и один для получения. Нам нужно, чтобы принимающий сокет связался при помощи функции
bindbindnetstatsendto13udp_clientsendto14-18SO_REUSEADDRbind19-20mcast_joinmcast_set_loop21-23forkНаша функция
sendmailmainЛистинг 21.9. Отправка дейтаграммы многоадресной передачи каждые 5 с
//mcast/send.c 1 #include "unp.h" 2 #include <sys/utsname.h> 3 #define SENDRATE 5 /* отправка дейтаграмм каждые 5 с */ 4 void 5 send_all(int sendfd, SA *sadest, socklen_t salen) 6 { 7 static char line[MAXLINE]; /* имя узла и идентификатор процесса */ 8 struct utsname myname; 9 if (uname(&myname) < 0)10 err_sys("uname error");11 snprintf(line, sizeof(line), "%s, %dn", myname, nodename, getpid());12 for (;;) {13 Sendto(sendfd, line, strlen(line), 0, sadest, salen);14 sleep(SENDRATE);15 }16 }9-11uname12-15sleepФункция
recv_allЛистинг 21.10. Получение всех дейтаграмм многоадресной передачи для группы, к которой мы присоединились
//mcast/recv.c 1 #include "unp.h"
