背景
在gdb调试ip地址过程中,往往看到的是一个整数,而不知其具体对应的点分十进制IP地址为多少。
方案一
使用字节对齐方式获得具体点分十进制IP为多少
数据结构
typedef union int2Ip {
unsigned int addr;
struct {
unsigned char a1;
unsigned char a2;
unsigned char a3;
unsigned char a4;
};
} int2Ip_t;
方案二
区分大端小端来确定具体点分十进制IP地址为多少
unsigned int intIp = 1613535268;
#if __BYTE_ORDER == __BIG_ENDIAN
printf("%d.%d.%d.%d\n", (intIp >> 24) & 0xff, (intIp >> 16) & 0xff, (intIp >> 8) & 0xff, intIp & 0xff);
#else
printf("%d.%d.%d.%d\n", intIp & 0xff, (intIp >> 8) & 0xff, (intIp >> 16) & 0xff, (intIp >> 24) & 0xff);
#endif
案例分析
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
typedef union int2Ip {
unsigned int addr;
struct {
unsigned char a1;
unsigned char a2;
unsigned char a3;
unsigned char a4;
};
} int2Ip_t;
int main(int argc, const char *argv[])
{
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
struct sockaddr_in addr1 = {0};
addr1.sin_family = AF_INET;
addr1.sin_port = htons(6000);
addr1.sin_addr.s_addr = inet_addr("192.168.129.187");
int2Ip_t int2ip = {
.addr = 3145836736
};
struct sockaddr_in addr2 = {0};
addr2.sin_family = AF_INET;
addr2.sin_port = htons(6000);
addr2.sin_addr.s_addr = inet_addr("127.0.0.1");
int2Ip_t int2ip2 = {
.addr = 16777343
};
struct sockaddr_in addr3 = {0};
addr3.sin_family = AF_INET;
addr3.sin_port = htons(6000);
addr3.sin_addr.s_addr = inet_addr("36.152.44.96");
int2Ip_t int2ip3 = {
.addr = 1613535268
};
unsigned int intIp = 1613535268;
#if __BYTE_ORDER == __BIG_ENDIAN
printf("%d.%d.%d.%d\n", (intIp >> 24) & 0xff, (intIp >> 16) & 0xff, (intIp >> 8) & 0xff, intIp & 0xff);
#else
printf("%d.%d.%d.%d\n", intIp & 0xff, (intIp >> 8) & 0xff, (intIp >> 16) & 0xff, (intIp >> 24) & 0xff);
#endif
sleep(10);
return 0;
}
gdb调试验证其正确性
(gdb) run
Starting program: /Asterisk/LocalDir/testDir/a.out
整数转换为点分十进制IP地址为:36.152.44.96
^C
Program received signal SIGINT, Interrupt.
0x00007ffff7ad9370 in nanosleep () from /lib/x86_64-linux-gnu/libc.so.6
(gdb) frame 2
#2 0x00000000004007d8 in main (argc=1, argv=0x7fffffffe238) at test6.c:54
54 sleep(10);
(gdb) info locals
sockfd = 3
addr1 = {sin_family = 2, sin_port = 28695, sin_addr = {s_addr = 3145836736}, sin_zero = "\000\000\000\000\000\000\000"}
int2ip = {addr = 3145836736, {a1 = 192 '\300', a2 = 168 '\250', a3 = 129 '\201', a4 = 187 '\273'}}
addr2 = {sin_family = 2, sin_port = 28695, sin_addr = {s_addr = 16777343}, sin_zero = "\000\000\000\000\000\000\000"}
int2ip2 = {addr = 16777343, {a1 = 127 '\177', a2 = 0 '\000', a3 = 0 '\000', a4 = 1 '\001'}}
addr3 = {sin_family = 2, sin_port = 28695, sin_addr = {s_addr = 1613535268}, sin_zero = "\000\000\000\000\000\000\000"}
int2ip3 = {addr = 1613535268, {a1 = 36 '$', a2 = 152 '\230', a3 = 44 ',', a4 = 96 '`'}}
intIp = 1613535268