TCP/IP中32位IP地址与字符串转化
来源:互联网 发布:centos设置防火墙端口 编辑:程序博客网 时间:2024/06/05 01:54
在网络上面我们用的IP都是数字加点(192.168.0.1)构成的, 而在struct in_addr结构中用的是32位的IP,我们上面那个32位IP(C0A80001)是的192.168.0.1 为了转换我们可以使用下面两个函数
int inet_aton(const char *cp,struct in_addr *inp)
char *inet_ntoa(struct in_addr in)
函数里面 a 代表 ascii n 代表network.第一个函数表示将a.b.c.d的IP转换为32位的IP,存储在 inp指针里面.第二个是将32位IP转换为a.b.c.d的格式.
同样inet_addr也可以进行字符串到32位整形的转换:
首先,假设你已经有了一个sockaddr_in结构体ina,你有一个IP地址"132.241.5.10" 要储存在其中,你就要用到函数inet_addr(),将IP地址从 点数格式转换成无符号长整型。使用方法如下:
ina.sin_addr.s_addr = inet_addr("132.241.5.10");
有的也使用unsigned long dst_ip = inet_addr("");
可见IPv4 套接口地址结构
struct in_addr
{
in_addr_t s_addr ;
}
// 32bits IPv4 地址
//网络字节顺序 Network Byte Order
类似:
struct in_addr
{
unsigned long s_addr; // that’s a 32-bit long, or 4 bytes
};
这里错误返回INADDR_NONE (实际上是-1,每位都是1)
而另一个INADDR_ANY的值为0,意思是任何地址都可以。
注意,inet_addr()返回的地址已经是网络字节格式,所以你无需再调用 函数htonl()。
我们现在发现上面的代码片断不是十分完整的,因为它没有错误检查。 显而易见,当inet_addr()发生错误时返回-1。记住这些二进制数字?(无符 号数)-1仅仅和IP地址255.255.255.255相符合!这可是广播地址!大错特 错!记住要先进行错误检查。
好了,现在你可以将IP地址转换成长整型了。有没有其相反的方法呢? 它可以将一个in_addr结构体输出成点数格式?这样的话,你就要用到函数 inet_ntoa()("ntoa"的含义是"network to ascii"),就像这样:
printf("%s",inet_ntoa(ina.sin_addr));
它将输出IP地址。需要注意的是inet_ntoa()将结构体in-addr作为一 个参数,不是长整形。同样需要注意的是它返回的是一个指向一个字符的 指针。它是一个由inet_ntoa()控制的静态的固定的指针,所以每次调用 inet_ntoa(),它就将覆盖上次调用时所得的IP地址。例如:
char *a1, *a2;
.
.
a1 = inet_ntoa(ina1.sin_addr); /* 这是198.92.129.1 */
a2 = inet_ntoa(ina2.sin_addr); /* 这是132.241.5.10 */
printf("address 1: %s ",a1);
printf("address 2: %s ",a2);
输出如下:
address 1: 132.241.5.10
address 2: 132.241.5.10
假如你需要保存这个IP地址,使用strcopy()函数来指向你自己的字符指针。
int inet_aton(const char *cp,struct in_addr *inp)
char *inet_ntoa(struct in_addr in)
函数里面 a 代表 ascii n 代表network.第一个函数表示将a.b.c.d的IP转换为32位的IP,存储在 inp指针里面.第二个是将32位IP转换为a.b.c.d的格式.
同样inet_addr也可以进行字符串到32位整形的转换:
首先,假设你已经有了一个sockaddr_in结构体ina,你有一个IP地址"132.241.5.10" 要储存在其中,你就要用到函数inet_addr(),将IP地址从 点数格式转换成无符号长整型。使用方法如下:
ina.sin_addr.s_addr = inet_addr("132.241.5.10");
有的也使用unsigned long dst_ip = inet_addr("");
可见IPv4 套接口地址结构
struct in_addr
{
in_addr_t s_addr ;
}
// 32bits IPv4 地址
//网络字节顺序 Network Byte Order
类似:
struct in_addr
{
unsigned long s_addr; // that’s a 32-bit long, or 4 bytes
};
这里错误返回INADDR_NONE (实际上是-1,每位都是1)
而另一个INADDR_ANY的值为0,意思是任何地址都可以。
注意,inet_addr()返回的地址已经是网络字节格式,所以你无需再调用 函数htonl()。
我们现在发现上面的代码片断不是十分完整的,因为它没有错误检查。 显而易见,当inet_addr()发生错误时返回-1。记住这些二进制数字?(无符 号数)-1仅仅和IP地址255.255.255.255相符合!这可是广播地址!大错特 错!记住要先进行错误检查。
好了,现在你可以将IP地址转换成长整型了。有没有其相反的方法呢? 它可以将一个in_addr结构体输出成点数格式?这样的话,你就要用到函数 inet_ntoa()("ntoa"的含义是"network to ascii"),就像这样:
printf("%s",inet_ntoa(ina.sin_addr));
它将输出IP地址。需要注意的是inet_ntoa()将结构体in-addr作为一 个参数,不是长整形。同样需要注意的是它返回的是一个指向一个字符的 指针。它是一个由inet_ntoa()控制的静态的固定的指针,所以每次调用 inet_ntoa(),它就将覆盖上次调用时所得的IP地址。例如:
char *a1, *a2;
.
.
a1 = inet_ntoa(ina1.sin_addr); /* 这是198.92.129.1 */
a2 = inet_ntoa(ina2.sin_addr); /* 这是132.241.5.10 */
printf("address 1: %s ",a1);
printf("address 2: %s ",a2);
输出如下:
address 1: 132.241.5.10
address 2: 132.241.5.10
假如你需要保存这个IP地址,使用strcopy()函数来指向你自己的字符指针。
0 0
- TCP/IP中32位IP地址与字符串转化
- TCP/IP中32位IP地址与字符串转化
- TCP/IP中32位IP地址与字符串转化
- TCP/IP中32位IP地址与点分IP(字符串)转换
- Ip地址与十进制转化
- IP地址字符串与整数的互相转化
- 32位整形数转化为IP地址
- TCP/IP之IP地址
- IP地址是TCP/IP网络中用来唯一标识每台主机或设备的地址,IP地址由32位
- 一个将u_long型的IP地址转化成字符串形式的IP地址方法
- 指针实现字符串IP地址转化为十进制IP地址输出-c语言
- 将十进制ip地址转化为字符串点分十进制ip地址
- ip地址转化为整数 整数转化为IP地址
- IP地址 DWORD与字符串转换
- IP地址 DWORD与字符串转换
- IP地址字符串与数组转换
- 在长字符串中提取IP地址
- 从字符串中截取ip地址
- 通用权限管理设计 之 数据库结构设计
- [DFS]《奥赛一本通》 素数环
- IT人生存法则
- kindeditor的上传图片简单代码
- android 自定义ImageView实现图片手势滑动、多点触摸缩放
- TCP/IP中32位IP地址与字符串转化
- Nginx Location配置总结
- XAMPP服务器在局域网只能本机访问且无法用IP访问的解决办法
- DevExpress.LookUpEdit控件实现自动搜索定位功能
- Java中的多线程
- 基于JQuery的Select级联
- git:解决git错误:fatal: The remote end hung up unexpectedly
- CloudStack 网络
- 一本对程序员很重要的书。