日期:2014-05-16  浏览次数:20810 次

关于gethostbyaddr
我想写一个小程序用来检测局域网内主机名,稍微改了一下先在自己机子上运行看是否显示自己的主机名
struct   sockaddr_in   my_addr,cli_addr,br_addr;
char   *part= "*** ";
int   sockfd,connfd,len,n,slen;
void   *th_do(void   *arg)
{
  while(1)
    sendto(sockfd,part,3,0,(struct   sockaddr*)&br_addr,sizeof(br_addr));
}
main()
{
  char   readbuf[max];
  struct   hostent   *hptr;
  pthread_t   tid;
  if((sockfd=socket(AF_INET,SOCK_DGRAM,0)) <0)
    {
    fprintf(stderr, "socket   err!\n ");
    exit(1);
    }
  bzero(&(my_addr),sizeof(my_addr));
  my_addr.sin_family=AF_INET;
  my_addr.sin_port=htons(SERVER_PORT);
  my_addr.sin_addr.s_addr=INADDR_ANY;
  bzero(&(br_addr),sizeof(br_addr));
  br_addr.sin_family=AF_INET;
  br_addr.sin_port=htons(SERVER_PORT);
  inet_aton( "10.17.5.255 ",&br_addr.sin_addr);
  if(bind(sockfd,(struct   sockaddr*)&my_addr,sizeof(struct   sockaddr)) <0)
    {
    fprintf(stderr, "bind   err!\n ");
    exit(1);
    }
  int   bBroadcast=1000;
  if((setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,(const   char*)&bBroadcast,sizeof(int)))==-1)
    printf( "set   error!\n ");
  pthread_create(&tid,NULL,th_do,NULL);
  len=sizeof(cli_addr);
  while(1)
  {
    if((n=recvfrom(sockfd,readbuf,max,0,(struct   sockaddr*)&(cli_addr),(void   *)&len))> 0)
      {
      printf( "OK!\n ");
      readbuf[n]= '\0 ';
      if(strcmp(readbuf,part)==0)
        {
        slen=sizeof(cli_addr.sin_addr);
        if(!(hptr=gethostbyaddr(&(cli_addr.sin_addr),slen,AF_INET)))
          printf( "get   error!\n ");
        else   printf( "%s\n ",errno);
        }
      }
    }
}运行老是get   error,看来是gethostbyaddr返回空的问题。。。
这是怎么回事?

------解决方案--------------------
try it
if(!(hptr=gethostbyaddr(&(cli_addr.sin_addr),&slen,AF_INET)))