⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 udpread.lc

📁 unix网络编程卷1:套接口API的全书源码
💻 LC
字号:
#include    "udpcksum.h"##  1 ##src/udpcksum/udpread.c##struct udpiphdr *udp_check(char *, int);##  2 ##src/udpcksum/udpread.c##/*##  3 ##src/udpcksum/udpread.c## * Read from the network until a UDP datagram is read that matches##  4 ##src/udpcksum/udpread.c## * the arguments.##  5 ##src/udpcksum/udpread.c## */##  6 ##src/udpcksum/udpread.c##/* include udp_read */struct udpiphdr *##  7 ##src/udpcksum/udpread.c##udp_read(void)##  8 ##src/udpcksum/udpread.c##{##  9 ##src/udpcksum/udpread.c##    int     len;## 10 ##src/udpcksum/udpread.c##    char   *ptr;## 11 ##src/udpcksum/udpread.c##    struct ether_header *eptr;## 12 ##src/udpcksum/udpread.c##    for (;;) {## 13 ##src/udpcksum/udpread.c##        ptr = next_pcap(&len);## 14 ##src/udpcksum/udpread.c##        switch (datalink) {## 15 ##src/udpcksum/udpread.c##        case DLT_NULL:          /* loopback header = 4 bytes */## 16 ##src/udpcksum/udpread.c##            return (udp_check(ptr + 4, len - 4));## 17 ##src/udpcksum/udpread.c##        case DLT_EN10MB:## 18 ##src/udpcksum/udpread.c##            eptr = (struct ether_header *) ptr;## 19 ##src/udpcksum/udpread.c##            if (ntohs(eptr->ether_type) != ETHERTYPE_IP)## 20 ##src/udpcksum/udpread.c##                err_quit("Ethernet type %x not IP", ntohs(eptr->ether_type));## 21 ##src/udpcksum/udpread.c##            return (udp_check(ptr + 14, len - 14));## 22 ##src/udpcksum/udpread.c##        case DLT_SLIP:          /* SLIP header = 24 bytes */## 23 ##src/udpcksum/udpread.c##            return (udp_check(ptr + 24, len - 24));## 24 ##src/udpcksum/udpread.c##        case DLT_PPP:           /* PPP header = 24 bytes */## 25 ##src/udpcksum/udpread.c##            return (udp_check(ptr + 24, len - 24));## 26 ##src/udpcksum/udpread.c##        default:## 27 ##src/udpcksum/udpread.c##            err_quit("unsupported datalink (%d)", datalink);## 28 ##src/udpcksum/udpread.c##        }## 29 ##src/udpcksum/udpread.c##    }## 30 ##src/udpcksum/udpread.c##}## 31 ##src/udpcksum/udpread.c##/* end udp_read *//*## 32 ##src/udpcksum/udpread.c## * Check the received packet.## 33 ##src/udpcksum/udpread.c## * If UDP and OK, return pointer to packet.## 34 ##src/udpcksum/udpread.c## * If ICMP error, return NULL.## 35 ##src/udpcksum/udpread.c## * We assume the filter picks out desired UDP datagrams.## 36 ##src/udpcksum/udpread.c## */## 37 ##src/udpcksum/udpread.c##/* include udp_check */struct udpiphdr *## 38 ##src/udpcksum/udpread.c##udp_check(char *ptr, int len)## 39 ##src/udpcksum/udpread.c##{## 40 ##src/udpcksum/udpread.c##    int     hlen;## 41 ##src/udpcksum/udpread.c##    struct ip *ip;## 42 ##src/udpcksum/udpread.c##    struct udpiphdr *ui;## 43 ##src/udpcksum/udpread.c##    if (len < sizeof(struct ip) + sizeof(struct udphdr))## 44 ##src/udpcksum/udpread.c##        err_quit("len = %d", len);## 45 ##src/udpcksum/udpread.c##    /* 4minimal verification of IP header */## 46 ##src/udpcksum/udpread.c##    ip = (struct ip *) ptr;## 47 ##src/udpcksum/udpread.c##    if (ip->ip_v != IPVERSION)## 48 ##src/udpcksum/udpread.c##        err_quit("ip_v = %d", ip->ip_v);## 49 ##src/udpcksum/udpread.c##    hlen = ip->ip_hl << 2;## 50 ##src/udpcksum/udpread.c##    if (hlen < sizeof(struct ip))## 51 ##src/udpcksum/udpread.c##        err_quit("ip_hl = %d", ip->ip_hl);## 52 ##src/udpcksum/udpread.c##    if (len < hlen + sizeof(struct udphdr))## 53 ##src/udpcksum/udpread.c##        err_quit("len = %d, hlen = %d", len, hlen);## 54 ##src/udpcksum/udpread.c##    if ((ip->ip_sum = in_cksum((uint16_t *) ip, hlen)) != 0)## 55 ##src/udpcksum/udpread.c##        err_quit("ip checksum error");## 56 ##src/udpcksum/udpread.c##    if (ip->ip_p == IPPROTO_UDP) {## 57 ##src/udpcksum/udpread.c##        ui = (struct udpiphdr *) ip;## 58 ##src/udpcksum/udpread.c##        return (ui);## 59 ##src/udpcksum/udpread.c##    } else## 60 ##src/udpcksum/udpread.c##        err_quit("not a UDP packet");## 61 ##src/udpcksum/udpread.c##}## 62 ##src/udpcksum/udpread.c##/* end udp_check */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -