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

📄 inet_pton.c

📁 在Linux/Unix环境下发包测试性能的工具
💻 C
字号:
#include "inet_aton.h"#ifdef __cplusplusextern "C" {#endif/* * Copyright (C) 1996-2001  Internet Software Consortium. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/#ifndef HAVE_INET_PTON#define NS_INT16SZ       2#define NS_INADDRSZ     4#define NS_IN6ADDRSZ    16/* int * isc_net_pton(af, src, dst) *      convert from presentation format (which usually means ASCII printable) *      to network format (which is usually some kind of binary format). * return: *      1 if the address was valid for the specified address family *      0 if the address wasn't valid (`dst' is untouched in this case) * author: *      Paul Vixie, 1996. */intinet_pton(int af,          const char *src,          void *dst) {    switch ( af ) {        case AF_INET:            return(inet_pton4(src, dst));#ifdef HAVE_IPV6        case AF_INET6:            return(inet_pton6(src, dst));#endif        default:            return 0;    }    /* NOTREACHED */}/* int * inet_pton4(src, dst) *      like inet_aton() but without all the hexadecimal and shorthand. * return: *      1 if `src' is a valid dotted quad, else 0. * notice: *      does not touch `dst' unless it's returning 1. * author: *      Paul Vixie, 1996. */intinet_pton4(src, dst)const char *src;unsigned char *dst;{    static const char digits[] = "0123456789";    int saw_digit, octets, ch;    unsigned char tmp[NS_INADDRSZ], *tp;    saw_digit = 0;    octets = 0;    *(tp = tmp) = 0;    while ( (ch = *src++) != '\0' ) {        const char *pch;        if ( (pch = strchr(digits, ch)) != NULL ) {            unsigned int new = *tp * 10 + (pch - digits);            if ( new > 255 )                return(0);            *tp = new;            if ( ! saw_digit ) {                if ( ++octets > 4 )                    return(0);                saw_digit = 1;            }        } else if ( ch == '.' && saw_digit ) {            if ( octets == 4 )                return(0);            *++tp = 0;            saw_digit = 0;        } else            return(0);    }    if ( octets < 4 )        return(0);    memcpy(dst, tmp, NS_INADDRSZ);    return(1);}/* int * inet_pton6(src, dst) *      convert presentation level address to network order binary form. * return: *      1 if `src' is a valid [RFC1884 2.2] address, else 0. * notice: *      (1) does not touch `dst' unless it's returning 1. *      (2) :: in a full address is silently ignored. * credit: *      inspired by Mark Andrews. * author: *      Paul Vixie, 1996. */#ifdef HAVE_IPV6intinet_pton6(src, dst)const char *src;unsigned char *dst;{    static const char xdigits_l[] = "0123456789abcdef",    xdigits_u[] = "0123456789ABCDEF";    unsigned char tmp[NS_IN6ADDRSZ], *tp, *endp, *colonp;    const char *xdigits, *curtok;    int ch, saw_xdigit;    unsigned int val;    memset((tp = tmp), '\0', NS_IN6ADDRSZ);    endp = tp + NS_IN6ADDRSZ;    colonp = NULL;    /* Leading :: requires some special handling. */    if ( *src == ':' )        if ( *++src != ':' )            return(0);    curtok = src;    saw_xdigit = 0;    val = 0;    while ( (ch = *src++) != '\0' ) {        const char *pch;        if ( (pch = strchr((xdigits = xdigits_l), ch)) == NULL )            pch = strchr((xdigits = xdigits_u), ch);        if ( pch != NULL ) {            val <<= 4;            val |= (pch - xdigits);            if ( val > 0xffff )                return(0);            saw_xdigit = 1;            continue;        }        if ( ch == ':' ) {            curtok = src;            if ( !saw_xdigit ) {                if ( colonp )                    return(0);                colonp = tp;                continue;            }            if ( tp + NS_INT16SZ > endp )                return(0);            *tp++ = (unsigned char) (val >> 8) & 0xff;            *tp++ = (unsigned char) val & 0xff;            saw_xdigit = 0;            val = 0;            continue;        }        if ( ch == '.' && ((tp + NS_INADDRSZ) <= endp) &&             inet_pton4(curtok, tp) > 0 ) {            tp += NS_INADDRSZ;            saw_xdigit = 0;            break;  /* '\0' was seen by inet_pton4(). */        }        return(0);    }    if ( saw_xdigit ) {        if ( tp + NS_INT16SZ > endp )            return(0);        *tp++ = (unsigned char) (val >> 8) & 0xff;        *tp++ = (unsigned char) val & 0xff;    }    if ( colonp != NULL ) {        /*         * Since some memmove()'s erroneously fail to handle         * overlapping regions, we'll do the shift by hand.         */        const int n = tp - colonp;        int i;        for ( i = 1; i <= n; i++ ) {            endp[- i] = colonp[n - i];            colonp[n - i] = 0;        }        tp = endp;    }    if ( tp != endp )        return(0);    memcpy(dst, tmp, NS_IN6ADDRSZ);    return(1);}#endif#endif /* HAVE_INET_PTON */#ifdef __cplusplus} /* end extern "C" */#endif

⌨️ 快捷键说明

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