UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
33 ui->ui_src.s_addr = ((struct sockaddr_in*)local)->sin_addr.s_addr;34 ui->ui_dst.s_addr = ((struct sockaddr_in*)dest)->sin_addr.s_addr;35 ui->ui_sport = ((struct sockaddr_in*)local)->sin_port;36 ui->ui_dport = ((struct sockaddr_in*)dest)->sin_port;37 ui->ui_ulen = ui->ui_len;38 if (zerosum == 0) {39 #if 1 /* заменить на if 0 для Solaris 2.x. x < 6 */40 if ((ui->ui_sum = m_cksum((u_int16_t*)in, userlen)) == 0)41 ui->ui_sum = 0xffff;42 #else43 ui->ui_sum = ui->ui_len;44 #endif45 }46 /* заполнение оставшейся части IP-заголовка */47 /* функция p_output() вычисляет и сохраняет контрольную сумму IP */48 ip->ip_v = IPVERSION;49 ip->ip_hl = sizeof(struct ip) >> 2;50 ip->ip_tos = 0;51 #if defined(linux) || defined(__OpenBSD__)52 ip->ip_len = htons(userlen); /* сетевой порядок байтов */53 #else54 ip->ip_len = userlen; /* порядок байтов узла */55 #endif56 ip->ip_id = 0; /* это пусть устанавливает уровень IP */57 ip->ip_off = 0; /* смещение флагов, флаги MF и DF */58 ip->ip_ttl = TTL_OUT;59 Sendto(rawfd, buf, userlen, 0, dest, destlen);60 }24-26ipipuiudpiphdr2728-31ui_lenuserlen32-45ui_sumzerosumЕсли при вычислении контрольной суммы получается 0, вместо него записывается значение
0xffffСледует отметить, что в Solaris 2.x, где x<6, в случаях, когда дейтаграммы UDP или сегменты TCP отправляются с символьного сокета при установленном параметре IP_HDRINCL, возникает ошибка. Контрольную сумму вычисляет ядро, а мы должны установить поле ui_sum равным длине дейтаграммы UDP.
36-49IP_HDRINCLIP_HDRINCLip_idsendtoОбратите внимание, что поле ip_len может иметь либо сетевой порядок байтов, либо порядок байтов узла. Это типичная проблема с совместимостью, возникающая при использовании символьных сокетов.
Следующая функция — это
udp_readЛистинг 29.11. Функция udp_read: чтение очередного пакета из устройства захвата пакетов
//udpcksum/udpread.c 7 struct udpiphdr* 8 udp_read(void) 9 {10 int len;11 char *ptr;12 struct ether_header *eptr;13 for (;;) {14 ptr = next_pcap(&len);15 switch (datalink) {16 case DLT_NULL: /* заголовок обратной петли = 4 байта */17 return (udp_check(ptr + 4, len — 4));18 case DLT_EN10MB:19 eptr = (struct ether_header*)ptr;
