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

📄 sourceroute.lc

📁 unix网络编程第一卷socket编程书上的全部源代码
💻 LC
字号:
/* include inet_srcrt_init */#include    "unp.h"##  1 ##src/ipopts/sourceroute.c###include    <netinet/in_systm.h>##  2 ##src/ipopts/sourceroute.c###include    <netinet/ip.h>##  3 ##src/ipopts/sourceroute.c##static u_char *optr;            /* pointer into options being formed */##  4 ##src/ipopts/sourceroute.c##static u_char *lenptr;          /* pointer to length byte in SRR option */##  5 ##src/ipopts/sourceroute.c##static int ocnt;                /* count of # addresses */##  6 ##src/ipopts/sourceroute.c##u_char *##  7 ##src/ipopts/sourceroute.c##inet_srcrt_init(void)##  8 ##src/ipopts/sourceroute.c##{##  9 ##src/ipopts/sourceroute.c##    optr = Malloc(44);          /* NOP, code, len, ptr, up to 10 addresses */## 10 ##src/ipopts/sourceroute.c##    bzero(optr, 44);            /* guarantees EOLs at end */## 11 ##src/ipopts/sourceroute.c##    ocnt = 0;## 12 ##src/ipopts/sourceroute.c##    return (optr);              /* pointer for setsockopt() */## 13 ##src/ipopts/sourceroute.c##}## 14 ##src/ipopts/sourceroute.c##/* end inet_srcrt_init *//* include inet_srcrt_add */int## 15 ##src/ipopts/sourceroute.c##inet_srcrt_add(char *hostptr, int type)## 16 ##src/ipopts/sourceroute.c##{## 17 ##src/ipopts/sourceroute.c##    int     len;## 18 ##src/ipopts/sourceroute.c##    struct addrinfo *ai;## 19 ##src/ipopts/sourceroute.c##    struct sockaddr_in *sin;## 20 ##src/ipopts/sourceroute.c##    if (ocnt > 9)## 21 ##src/ipopts/sourceroute.c##        err_quit("too many source routes with: %s", hostptr);## 22 ##src/ipopts/sourceroute.c##    if (ocnt == 0) {## 23 ##src/ipopts/sourceroute.c##        *optr++ = IPOPT_NOP;    /* NOP for alignment */## 24 ##src/ipopts/sourceroute.c##        *optr++ = type ? IPOPT_SSRR : IPOPT_LSRR;## 25 ##src/ipopts/sourceroute.c##        lenptr = optr++;        /* we fill in the length later */## 26 ##src/ipopts/sourceroute.c##        *optr++ = 4;            /* offset to first address */## 27 ##src/ipopts/sourceroute.c##    }## 28 ##src/ipopts/sourceroute.c##    ai = Host_serv(hostptr, "", AF_INET, 0);## 29 ##src/ipopts/sourceroute.c##    sin = (struct sockaddr_in *) ai->ai_addr;## 30 ##src/ipopts/sourceroute.c##    memcpy(optr, &sin->sin_addr, sizeof(struct in_addr));## 31 ##src/ipopts/sourceroute.c##    freeaddrinfo(ai);## 32 ##src/ipopts/sourceroute.c##    optr += sizeof(struct in_addr);## 33 ##src/ipopts/sourceroute.c##    ocnt++;## 34 ##src/ipopts/sourceroute.c##    len = 3 + (ocnt * sizeof(struct in_addr));## 35 ##src/ipopts/sourceroute.c##    *lenptr = len;## 36 ##src/ipopts/sourceroute.c##    return (len + 1);           /* size for setsockopt() */## 37 ##src/ipopts/sourceroute.c##}## 38 ##src/ipopts/sourceroute.c##/* end inet_srcrt_add *//* include inet_srcrt_print */void## 39 ##src/ipopts/sourceroute.c##inet_srcrt_print(u_char *ptr, int len)## 40 ##src/ipopts/sourceroute.c##{## 41 ##src/ipopts/sourceroute.c##    u_char  c;## 42 ##src/ipopts/sourceroute.c##    char    str[INET_ADDRSTRLEN];## 43 ##src/ipopts/sourceroute.c##    struct in_addr hop1;## 44 ##src/ipopts/sourceroute.c##    memcpy(&hop1, ptr, sizeof(struct in_addr));## 45 ##src/ipopts/sourceroute.c##    ptr += sizeof(struct in_addr);## 46 ##src/ipopts/sourceroute.c##    while ((c = *ptr++) == IPOPT_NOP) ; /* skip any leading NOPs */## 47 ##src/ipopts/sourceroute.c##    if (c == IPOPT_LSRR)## 48 ##src/ipopts/sourceroute.c##        printf("received LSRR: ");## 49 ##src/ipopts/sourceroute.c##    else if (c == IPOPT_SSRR)## 50 ##src/ipopts/sourceroute.c##        printf("received SSRR: ");## 51 ##src/ipopts/sourceroute.c##    else {## 52 ##src/ipopts/sourceroute.c##        printf("received option type %d\n", c);## 53 ##src/ipopts/sourceroute.c##        return;## 54 ##src/ipopts/sourceroute.c##    }## 55 ##src/ipopts/sourceroute.c##    printf("%s ", Inet_ntop(AF_INET, &hop1, str, sizeof(str)));## 56 ##src/ipopts/sourceroute.c##    len = *ptr++ - sizeof(struct in_addr);  /* subtract dest IP addr */## 57 ##src/ipopts/sourceroute.c##    ptr++;                      /* skip over pointer */## 58 ##src/ipopts/sourceroute.c##    while (len > 0) {## 59 ##src/ipopts/sourceroute.c##        printf("%s ", Inet_ntop(AF_INET, ptr, str, sizeof(str)));## 60 ##src/ipopts/sourceroute.c##        ptr += sizeof(struct in_addr);## 61 ##src/ipopts/sourceroute.c##        len -= sizeof(struct in_addr);## 62 ##src/ipopts/sourceroute.c##    }## 63 ##src/ipopts/sourceroute.c##    printf("\n");## 64 ##src/ipopts/sourceroute.c##}## 65 ##src/ipopts/sourceroute.c##/* end inet_srcrt_print */

⌨️ 快捷键说明

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