读书人

好难过小弟我写的代码哪位高手给小弟

发布时间: 2012-04-12 15:46:35 作者: rapoo

好难过,我写的代码谁给我纠正下。。。
#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;}
[解决办法]
探讨

楼上的代码 貌似可行。有没有更简洁的啊 。

读书人网 >C++

热点推荐