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

📄 inet_ntop.c

📁 mediastreamer2是开源的网络传输媒体流的库
💻 C
字号:
/*  eXosip - This is the eXtended osip library.  Copyright (C) 2002,2003,2004,2005,2006,2007  Aymeric MOIZARD  - jack@atosc.org    eXosip is free software; you can redistribute it and/or modify  it under the terms of the GNU General Public License as published by  the Free Software Foundation; either version 2 of the License, or  (at your option) any later version.    eXosip is distributed in the hope that it will be useful,  but WITHOUT ANY WARRANTY; without even the implied warranty of  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  GNU General Public License for more details.    You should have received a copy of the GNU General Public License  along with this program; if not, write to the Free Software  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA*//* This is from the BIND 4.9.4 release, modified to compile by itself *//* Copyright (c) 1996 by 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. */#if defined(WIN32) || defined(_WIN32_WCE)#include <osipparser2/osip_port.h>#include "eXosip2.h"#include <windowsx.h>#include <winsock2.h>#include <ws2tcpip.h>#include <iphlpapi.h>#include "inet_ntop.h"/* added by adm *//* * the definitions below are valid for 32-bit architectures and will have to * be adjusted for 16- or 64-bit architectures */typedef unsigned __int8 uint8_t;typedef unsigned __int16 uint16_t;typedef unsigned __int32 uint32_t;typedef unsigned __int64 uint64_t;typedef __int8 int8_t;typedef __int16 int16_t;typedef __int32 int32_t;typedef __int64 int64_t;typedef unsigned long in_addr_t;/* !added by amd */#define	IN6ADDRSZ	16#define	INT16SZ		 2#ifndef	AF_INET6#define	AF_INET6	AF_MAX+1        /* just to let this compile */#endif/* * WARNING: Don't even consider trying to compile this on a system where * sizeof(int) < 4.  sizeof(int) > 4 is fine; all the world's not a VAX. */static const char *_inet_ntop4 (const u_char * src, char *dst, size_t size);static const char *_inet_ntop6 (const u_char * src, char *dst, size_t size);/* char * * inet_ntop(af, src, dst, size) *	convert a network format address to presentation format. * return: *	pointer to presentation format address (`dst'), or NULL (see errno). * author: *	Paul Vixie, 1996. */const char *_inet_ntop (af, src, dst, size)     int af;     const void *src;     char *dst;     size_t size;{  switch (af)    {      case AF_INET:        return (_inet_ntop4 (src, dst, size));      case AF_INET6:        return (_inet_ntop6 (src, dst, size));      default:#ifndef _WIN32_WCE        errno = EAFNOSUPPORT;#endif        return (NULL);    }  /* NOTREACHED */}/* const char * * inet_ntop4(src, dst, size) *	format an IPv4 address, more or less like inet_ntoa() * return: *	`dst' (as a const) * notes: *	(1) uses no statics *	(2) takes a u_char* not an in_addr as input * author: *	Paul Vixie, 1996. */static const char *_inet_ntop4 (src, dst, size)     const u_char *src;     char *dst;     size_t size;{  static const char fmt[] = "%u.%u.%u.%u";  char tmp[sizeof "255.255.255.255"];  sprintf (tmp, fmt, src[0], src[1], src[2], src[3]);  if ((size_t) strlen (tmp) > size)    {#ifndef _WIN32_WCE      errno = ENOSPC;#endif      return (NULL);    }  strcpy (dst, tmp);  return (dst);}/* const char * * inet_ntop6(src, dst, size) *	convert IPv6 binary address into presentation (printable) format * author: *	Paul Vixie, 1996. */static const char *_inet_ntop6 (src, dst, size)     const u_char *src;     char *dst;     size_t size;{  /*   * Note that int32_t and int16_t need only be "at least" large enough   * to contain a value of the specified size.  On some systems, like   * Crays, there is no such thing as an integer variable with 16 bits.   * Keep this in mind if you think this function should have been coded   * to use pointer overlays.  All the world's not a VAX.   */  char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"], *tp;  struct  {    int base, len;  } best, cur;  uint32_t words[IN6ADDRSZ / INT16SZ];  int i;  /*   * Preprocess:   *      Copy the input (bytewise) array into a wordwise array.   *      Find the longest run of 0x00's in src[] for :: shorthanding.   */  memset (words, 0, sizeof words);  for (i = 0; i < IN6ADDRSZ; i++)    words[i / 2] |= (src[i] << ((1 - (i % 2)) << 3));  best.base = -1;  cur.base = -1;  for (i = 0; i < (IN6ADDRSZ / INT16SZ); i++)    {      if (words[i] == 0)        {          if (cur.base == -1)            cur.base = i, cur.len = 1;          else            cur.len++;      } else        {          if (cur.base != -1)            {              if (best.base == -1 || cur.len > best.len)                best = cur;              cur.base = -1;            }        }    }  if (cur.base != -1)    {      if (best.base == -1 || cur.len > best.len)        best = cur;    }  if (best.base != -1 && best.len < 2)    best.base = -1;  /*   * Format the result.   */  tp = tmp;  for (i = 0; i < (IN6ADDRSZ / INT16SZ); i++)    {      /* Are we inside the best run of 0x00's? */      if (best.base != -1 && i >= best.base && i < (best.base + best.len))        {          if (i == best.base)            *tp++ = ':';          continue;        }      /* Are we following an initial run of 0x00s or any real hex? */      if (i != 0)        *tp++ = ':';      /* Is this address an encapsulated IPv4? */      if (i == 6 && best.base == 0 &&          (best.len == 6 || (best.len == 5 && words[5] == 0xffff)))        {          if (!_inet_ntop4 (src + 12, tp, sizeof tmp - (tp - tmp)))            return (NULL);          tp += strlen (tp);          break;        }      sprintf (tp, "%x", words[i]);      tp += strlen (tp);    }  /* Was it a trailing run of 0x00's? */  if (best.base != -1 && (best.base + best.len) == (IN6ADDRSZ / INT16SZ))    *tp++ = ':';  *tp++ = '\0';  /*   * Check for overflow, copy, and we're done.   */  if ((size_t) (tp - tmp) > size)    {#if !defined (_WIN32_WCE)      errno = ENOSPC;#endif      return (NULL);    }  strcpy (dst, tmp);  return (dst);}#endif

⌨️ 快捷键说明

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