好难过,我写的代码谁给我纠正下。。。
#include <stdio.h>
#include <winsock2.h>
int main()
{
char buff[255];
WSAData wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
hostent * hostaddr,*tmp;
gethostname(buff, sizeof(buff));
hostaddr=gethostbyname(buff);
printf("Host name is: %s\n", buff);
printf("ip:%s\n",inet_ntoa(*(struct in_addr *)hostaddr->h_addr));
while (1)
{tmp = gethostbyname(buff);
printf("ip tmp:%s\n",inet_ntoa(*(struct in_addr *)tmp->h_addr));
printf("ip hostaddr:%s\n",inet_ntoa(*(struct in_addr *)hostaddr->h_addr));
Sleep(3000);
}
WSACleanup();
return 0;
}
//本机ip:192.168.0.1
//运行本程序后 我把本机ip改为 192.168.0.2 后
怎么打印的都是 192.168.0.2 之前的结构体hostaddr 输出的是 192.168.0.1
我下面是用tmp = gethostbyname(buff); 所以我觉得应该是 用tmp 输出192.168.0.2
用hostaddr 输出 192.168.0.1
这是我想的 但是怎么hostaddr 也会随着 后面的程序 从新获得ip后 跟着也改变呀
还有就是 我不懂的是 tmp 和 hostaddr这两个结构体的 指针地址 怎么一样呀。
谁能给我讲解下 我真的很笨的。
[解决办法]
跟据程序,tmp与hostaddr公用同一个缓冲区,输出结果相同也很正常阿。
要不同,就必须分别分配空间。
[解决办法]
对于IPv4来说,所有的地址都是unsigned long类型,而一个子段是256,因此,你可以这样定义:
- C/C++ code
union Addr{ unsigned char c[4]; unsigned long u;};int AddAddr(int *A,int N){ int ret=-1; if(!A||N<=0) return ret; char str[32]={0},buf[256]={0}; hostent *hptr; for(int i=0;i<N;++i){ hptr = gethostbyname(buff); inet_ntop(hptr->h_addrtype,hptr->h_aliases,str,sizeof(str)); sscanf(str,"%d.%d.%d.%d",&(A[i].c[0]),&(A[i].c[1]),&(A[i].c[2]),&(A[i].c[3]));} ret = 0; return ret;}
[解决办法]