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

更新时间:2023-04-27 02:38:41 阅读: 评论:0


2023年4月27日发(作者:善心)

IP地址格式转换(htonlntohlinet_addrinet_ntoa

1htonl ()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 ()-----主机顺序转换成⽹络顺序

2inet_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_addru_long类型的数值。

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

sockaddr_in , sockaddr , in_addr区别

struct sockaddr {

u关公怎么死的 nsigned 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;

un雾的词语 signed char si鲅鱼的家常做法 n_zero[8];

};

struct in_addr就是32IP地址。

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)转换为上述结构中需要的32IP地址(0xC0A80001)

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

通常的⽤法是:

int sockfd;

struct sockaddr_in my_addr;

sockfd = socket(AF_INET, SOCK_STREAM, 0);

my__family = AF_INET;

my__port = htons(MYPORT);

my__addr.s_addr = inet_addr("192.168.0.1");

bzero(&(my__ze饼怎么做好吃 ro), 8);

bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));

可以⽤C++做个不太准确的假设。

sockaddrba class

s肉怎么炒好吃 ockaddr_in 等是derived class

如此⼀来,bind, connect , ndto , recvfrom等函数就可以使⽤ba class

来处理多种不同的derived class了。

但是实际上,这是没有继承关系数据结构(C嘛),所以需要强制造型来转换数据类型。正因为如此,在ndto的时候需要给出len长度,因为不同的sockaddr_xx实现长度并

不相同。

名词解析:

主机字节序:

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

2Big行测考试题型 endian:低字节存低地址,⾼字节存⾼地址

⽹络字节序:

⽹络字节顺序是TCP/IP中规定好的⼀种数据表⽰格式,它与具体的CPU类型、操作系统等⽆关,从⽽可以保证数据在不同主机之间传输时能够被正确解释。⽹络字节顺序采

big endi玉米碴子粥的做法 an排序⽅式。

为了进⾏转换bsd socket提供了转换的函数,有下⾯四个⽹络与主机字节转换函数:htons ntohs htonl ntohl (s 就是short llong hhost nnetwork)

htons unsigned short类型从主机序转换到⽹络序,htonl unsigned long类型从主机序转换到⽹络序,ntohs uns凉州词意思 igned 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


本文发布于:2023-04-27 02:38:41,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/516463.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图