不同的DWORD转换为IP地址为什么IP相同?该如何解决

不同的DWORD转换为IP地址为什么IP相同?
程序主要实现接收到主机ping命令后,在数据包中加入系统时间后返回给主机。定义了如下结构体:
typedef   struct   _IP{ 
union 
{   
BYTE   Version; 
BYTE   HdrLen; 
}; 
BYTE   ServiceType;
WORD   TotalLen; 
WORD   ID; 
union 
{   
WORD   Flags;  
WORD   FragOff; 
}; 
BYTE   TimeToLive; 
BYTE   Protocol; 
WORD   HdrChksum;
DWORD   SrcAddr;  
DWORD   DstAddr; 
BYTE   Options; 
}   IP;  


接收ping代码为:

while(TRUE) 

int ret = recv(sock, RecvBuf, size, 0);
               _IP   ip   =   *(IP*)RecvBuf;
DWORD addd = ip.SrcAddr;   //addd = 3825313984,对应IP=192.168.1.228
char* sa = inet_ntoa(*(in_addr*)&addd);
DWORD addd2 = ip.DstAddr;   //addd2 = 2634131648,对应IP=192.168.1.157
char* da = inet_ntoa(*(in_addr*)&addd2);
int len = ntohs(ip.TotalLen);
printf("from %s , to %s , recv size %d, pack size %d \n",sa, da, ret, len);
}

但测试时发现ip.SrcAddr和ip.DstAddr是正确的,而sa 和da 都是192.168.1.157,请问这是为什么啊?为什么2个值一样呢?
------解决方案--------------------
 
你的 inet_ntoa 使用了临时量
为每个 地址 使用一个CopyMemory

另外 这样定义似乎 不对
  union 
    {   
        BYTE   Version; 
        BYTE   HdrLen; 
    }; 


应该是  
#ifdef 小尾字序
BYTE Version : 4;
BYTE HdrLen :4;
#else /*大尾字序*/
BYTE HdrLen :4;
BYTE Version : 4;
#endif




------解决方案--------------------
请参考《WinSock网络编程经络》第11章,摘录书中内容如下:
================
inet_ntoa把网络字节序的IP地址转换成点十进制的IP地址,符合人的阅读习惯。函数返回的字符串所用的内存是WinSock分配的,实际是在一个静态缓冲区中,也就意味着函数是不可重入的,WinSock只保证在同一线程中下一次的API调用之前该内存是有效的。如果应用程序要使用inet_ntoa的返回结果,需要自己分配内存,把结果保存下来。
================
根据描述你的sa,da指向的是同一块静态缓冲区,所以值是最后一个的结果,即da的值,要想得到sa的,需要把数据拷贝到另外的缓冲区中.