1、htonl ()和ntohl( )

u_long PASCAL FAR ntohl (u_long netlong);

u_short PASCAL FAR ntohs (u_short netshort);

ntohl( )-----网络顺序转换成主机顺序

u_long PASCAL FAR htonl (u_long hostlong);

u_short PASCAL FAR htons (u_short hostshort);

htonl ()-----主机顺序转换成网络顺序

2、inet_addr( )和inet_ntoa ( )

unsigned long PASCAL FAR inet_addr (const char FAR * cp);

char FAR * PASCAL FAR inet_ntoa (struct in_addr in);

inet_addr函数需要一个字符串作为其参数,该字符串指定了以点分十进制格式表示的IP地址(例如:192.168.0.16)。而且inet_addr函数会返回一个适合分配给S_addr的u_long类型的数值。

Inet_ntoa函数会完成相反的转换,它接受一个in_addr结构体类型的参数并返回一个以点分十进制格式表示的IP地址字符串。

sockaddr_in , sockaddr , in_addr区别

struct   sockaddr   {  
                unsigned   short   sa_family;     
                char   sa_data[14];     
        };  
  上面是通用的socket地址,具体到Internet   socket,用下面的结构,二者可以进行类型转换  
         
  struct   sockaddr_in   {  
                short   int   sin_family;     
                unsigned   short   int   sin_port;     
                struct   in_addr   sin_addr;     
                unsigned   char   sin_zero[8];     
        };  
        struct   in_addr就是32位IP地址。  
        struct   in_addr   {  
                union {
                        struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
                        struct { u_short s_w1,s_w2; } S_un_w;
                        u_long S_addr; 
                } S_un;

#define s_addr  S_un.S_addr
        };  
   inet_addr()是将一个点分制的IP地址(如192.168.0.1)转换为上述结构中需要的32位IP地址(0xC0A80001)。

填值的时候使用sockaddr_in结构,而作为函数(如socket, listen, bind等)的参数传入的时候转换成sockaddr结构就行了,毕竟都是16个字符长。

通常的用法是:  
  int   sockfd;  
  struct   sockaddr_in   my_addr;  
  sockfd   =   socket(AF_INET,   SOCK_STREAM,   0);     
   
  my_addr.sin_family   =   AF_INET;     
  my_addr.sin_port   =   htons(MYPORT);     
  my_addr.sin_addr.s_addr   =   inet_addr("192.168.0.1");  
   
  bzero(&(my_addr.sin_zero),   8);     
    
  bind(sockfd,   (struct   sockaddr   *)&my_addr,   sizeof(struct   sockaddr));

可以用C++做个不太准确的假设。  
sockaddr是base   class    
sockaddr_in   等是derived   class  
如此一来,bind,   connect   ,   sendto   ,   recvfrom等函数就可以使用base   class  
来处理多种不同的derived   class了。  
但是实际上,这是没有继承关系数据结构(C嘛),所以需要强制造型来转换数据类型。正因为如此,在sendto的时候需要给出len长度,因为不同的sockaddr_xx实现长度并不相同。

名词解析:

主机字节序:

不同的CPU有不同的字节序类型,这些字节序是指整数在内存中保存的顺序,这个叫做主机序。最常见的有两种 1.Little endian:低字节存高地址,高字节存低地址 2.Big endian:低字节存低地址,高字节存高地址

网络字节序:

网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian排序方式。

为了进行转换bsd socket提供了转换的函数,有下面四个网络与主机字节转换函数:htons ntohs htonl ntohl (s 就是short l是long h是host n是network)

htons 把unsigned short类型从主机序转换到网络序,htonl 把unsigned long类型从主机序转换到网络序,ntohs 把unsigned short类型从网络序转换到主机序,ntohl 把unsigned long类型从网络序转换到主机序。

在使用little endian的系统中 这些函数会把字节序进行转换 在使用big endian类型的系统中这些函数会定义成空宏

将用点分割的IP地址转换位一个in_addr结构的地址,这个结构的定义见笔记(一),实际上就是一个unsigned long值。计算机内部处理IP地址可是不认识如192.1.8.84之类的数据。  
unsigned long inet_addr( const char FAR * cp );
举例:inet_addr("192.1.8.84")=1409810880
inet_addr("127.0.0.1")= 16777343

如果发生错误,函数返回INADDR_NONE值。
将网络地址转换位用点分割的IP地址,是上面函数的逆函数。  
char FAR * inet_ntoa( struct in_addr in );
举例:char * ipaddr=NULL;
char addr[20];
in_addr inaddr;
inaddr. s_addr=16777343;
ipaddr= inet_ntoa(inaddr);
strcpy(addr,ipaddr);  
这样addr的值就变为127.0.0.1。
注意意不要修改返回值或者进行释放动作。如果函数失败就会返回NULL值

转载于:https://www.cnblogs.com/huty/p/8517275.html

【VS开发】IP地址格式转换(htonl、ntohl;inet_addr、inet_ntoa)相关推荐

  1. 大小端、字节顺序转换函数和IP地址格式转换函数

    大小端.字节顺序转换函数和IP地址格式转换函数 大小端 CPU大小端之分 常见字节序 字节顺序转换函数 Linux系统下定义 Windows系统下 ntohs() htons() htonl()和nt ...

  2. 【网络】IP地址格式转换(htonl、ntohl;inet_addr、inet_ntoa)

    1.htonl ()和ntohl( ) u_long PASCAL FAR ntohl (u_long netlong); u_short PASCAL FAR ntohs (u_short nets ...

  3. IP地址格式转换(htonl、ntohl;inet_addr、inet_ntoa)

    1.htonl ()和ntohl( ) u_long PASCAL FAR ntohl (u_long netlong); u_short PASCAL FAR ntohs (u_short nets ...

  4. ip地址转换htonl的用法

    说明 u_long PASCAL FAR htonl ( __in u_long hostlong); htonl(将32位主机字符顺序转换成网络字符顺序)(用于IP的转换) IP转换为数值 unsi ...

  5. linux 网址转换工具,Linux下强大IP地址格式转换工具--netmask命令

    由于一般的路由器.防火墙等并不支持IP地址范围的方式,所以工作中经常要把IP地址范围转换成子网掩码的格式.CIDR格式.思科反向子网掩码格式等! 虽然windows下有些工具可以做到,可是使用起来不方 ...

  6. java转换ip地址格式转换_Java编程IP地址和数字相互转换代码示例

    最近才知道,将ip地址转换成十进制.八进制.十六进制同样可以访问网站. IP转为数字(第二种算法.用左移.按位或实现.效率更高.): public long ipToLong(String ipAdd ...

  7. ip地址转换数字函数 iton_esp8266 inet_ntoa函数实现 ip地址转换为字符串 MAC地址转字符串...

    esp8266芯片可作为mcu,功能很强大,但与传统mcu相比,可用资源实在不多,连浮点数都不支持 IP地址转字符创函数inet_ntoa很方便,但8266中没有!!!!! 本节将讲述如何自己实现in ...

  8. Socket中常见的几个转换函数(htonl,htons,ntohl,ntohs,inet_addr,inet_ntoa)

    Socket中常见的几个转换函数(htonl,htons,ntohl,ntohs,inet_addr,inet_ntoa) htonl() htons() ntohl() ntohs()及inet_n ...

  9. 网络字节顺序和主机字节顺序的转换(htons ntohs htonl ntohl)

    from  https://blog.csdn.net/baidu_33621692/article/details/53213002 网络字节顺序和主机字节顺序的转换(htons ntohs hto ...

最新文章

  1. java反射最佳实践,java反射性能测试分析
  2. FSM(状态机)、HFSM(分层状态机)、BT(行为树)的区别
  3. python——多态
  4. 51单片机之定时器\计数器的工作原理
  5. 消息称iPhone 14、14 Max仍采用A15处理器
  6. oracle database 10g rman备份与恢复pdf,Oracle Database10g RMAN备份与恢复
  7. 2019年成都房产新政,有这些内容需注意
  8. DELL戴尔开启/关闭触摸板方法
  9. 博科SAN交换机配置Trunk
  10. 蜗牛星际b款装服务器系统,蜗牛星际B款单网口折腾
  11. Ubuntu16.04安装后要做的一些事情
  12. Java中的equals和==比较
  13. 计算两个时间的间隔时长
  14. 实现软件GPS的软硬件设计讨论
  15. php判断数组的值是否为空,PHP判断数组(多维数组)值是否为空
  16. w指令中的IDLE是什么意思
  17. 思博伦Spirent Testcenter C50-100G以太网测试仪_双极未来
  18. 【转】计算机词汇简繁体对照表
  19. C语言_有趣的逻辑推理问题
  20. iphone11如何强制关机 苹果11手机一键强制重启方法教程

热门文章

  1. Linux crontab定时执行任务
  2. CTF dotNet逆向分析
  3. java sql 登录失败_java – 接收连接到SQL Server 2008的SQLException“用户登录失败”
  4. python羊车门问题_「羊车门」经典概率题中不换门选中车的概率是多少?
  5. python jieba库下载_Python中jieba库安装步骤及失败原因解析
  6. lumion自动保存_LUMION吊打MAX,轻松玩转规划渲染!
  7. gitlab将分支代码合并到master上
  8. 前端面试题之http/HTML/浏览器(一)
  9. java数组根据下标插入数据
  10. html和php文件怎么连接,html页面跟php文件连接的方法