inet_ntop函数的简单实现及调用

来源:互联网 发布:数控车床编程入门下载 编辑:程序博客网 时间:2024/06/05 20:50

日前在学习大神之作《Unix网络编程》,并尝试将书中代码coding并运行。

今天仿写的是inet_ntop()函数,位于原书P61页,该函数可实现网络字节序的二进制值到点分十进制字符串的转换。

其中,字母n代表numeric,格式存在于套接口地址结构中的二进制值;

            字母p代表presentation,格式通常是ASCII串。

   

以下代码为inet_ntop()的简单实现及调用,且仅支持IPv4。

运行结果例如:

$ ./a.out 0x816fa8c0
numeric: 0x816fa8c0 
presentation: 192.168.111.129 

作为一只小小菜鸟,在学习的路上还望各位大牛多多指正微笑


#include <stdio.h>#include <stdlib.h>#include <netinet/in.h>#include <string.h>#define INET_ADDRLEN 20const char* simplified_inet_ntop(int family, const void *addrptr, char *strptr, int len){    unsigned char temp_str[INET_ADDRLEN];    memset(temp_str, 0,INET_ADDRLEN);    const unsigned char* temp_addrptr = (const unsigned char*)addrptr;    if(family == AF_INET)    {    snprintf(temp_str, sizeof(temp_str),"%d.%d.%d.%d",    *temp_addrptr,*(temp_addrptr+1),*(temp_addrptr+2),*(temp_addrptr+3));        if(strlen(temp_str) >= len)    {            return NULL;        }else        {            memcpy(strptr,temp_str, strlen(temp_str));            return strptr;}    }    else    {        printf("protocol not supported!\n");        return NULL;    }}int main(int argc, char *argv[]){    unsigned char str[INET_ADDRLEN];    memset(str, 0, INET_ADDRLEN);    struct in_addr addr;    memset(&addr, 0, sizeof(addr));    if(argc == 2)    {        sscanf(argv[1], "%x", &addr.s_addr);    }    else    {        printf("Usage: ./a.out 0xXXXXXXXX\r\n");        exit(1);    }    if(simplified_inet_ntop(AF_INET,(const void *)&addr, str, INET_ADDRLEN)        == NULL)    {        printf("inet_ntop error for %s \r\n", argv[1]);        exit(1);    }    else    {        printf("numeric: 0x%x \r\n",addr.s_addr);        printf("presentation: %s \r\n",str);        exit(0);    }}






0 0
原创粉丝点击