windows inet_ntop inet_pton可参考linux下的实现

文章转载自: 罗索实验室  [ http://www.rosoo.net/a/201102/10957.html ]

linux下这两个函数可以直接调用,windows没有实现这两个函数,需要自己实现

#ifdef _WIN32 
static const char *  inet_ntop4(const u_char *src, char *dst, size_t size) 

{  
 static const char fmt[] = "%u.%u.%u.%u";  
 char tmp[sizeof("255.255.255.255")];  
 int l;
 l = _snprintf(tmp, size, fmt, src[0], src[1], src[2], src[3]); 

 if (l <= 0 || l >= size) 
 {   
  return (NULL);  
 }  
 strncpy(dst, tmp, size);  
 return (dst);
}

static const char *  inet_ntop6(const u_char *src, char *dst, size_t size) 

char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"];  
char *tp, *ep;  
struct 

 int base, len; 
} best, cur;  
u_int words[IN6ADDRSZ / INT16SZ];  
int i;
int advance;  
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;  
tp = tmp; 

ep = tmp + sizeof(tmp); 

for (i = 0; i < (IN6ADDRSZ / INT16SZ) && tp < ep; 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) { 

if (tp + 1 >= ep)  
return (NULL); 

*tp++ = ':'; 

continue; 

/** Are we following an initial run of 0x00s or any real hex? */

if (i != 0) { 

if (tp + 1 >= ep) 

return (NULL); 

*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, (size_t)(ep - tp))) 

return (NULL); 

tp += strlen(tp); 

break; 

advance = snprintf(tp, ep - tp, "%x", words[i]); 

if (advance <= 0 || advance >= ep - tp) 

return (NULL); 

tp += advance; 

/** Was it a trailing run of 0x00's? */

if (best.base != -1 && (best.base + best.len) == (IN6ADDRSZ / INT16SZ)) { 

if (tp + 1 >= ep) 

return (NULL); 

*tp++ = ':'; 

if (tp + 1 >= ep) 

return (NULL); 

*tp++ = '\0'; 

 

/** 

* Check for overflow, copy, and we're done. 

*/

if ((size_t)(tp - tmp) > size) { 

errno = ENOSPC;  
return (NULL); 

strlcpy(dst, tmp, size); 

return (dst); 

}  
const char *  inet_ntop(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: 

errno = EAFNOSUPPORT; 

return (NULL);  

/** NOTREACHED */

}
#endif

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值