Jak pobrac nazwe serwera

0

Mam takie pytanko jak pobrac nazwe servera (chodzi mi o nazwe domeny internetowej) znajac jego ip?
Domyslam sie ze trzeba cos pokombinowac z dns, ale nie ma pojecia jak sie za to zabrac

0
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <arpa/inet.h>
#include <netinet/in.h>    // for bsd



int main(int argc,char** argv){
  char* d="127.0.0.1";
  if(argc>1)d=argv[1];
  addrinfo* a;
  addrinfo  b;
  bzero(&b,sizeof(addrinfo));
  b.ai_flags   =AI_CANONNAME;
#ifdef AI_V4MAPPED
  b.ai_flags  |=AI_V4MAPPED;
#endif
#ifdef AI_ADDRCONFIG
  b.ai_flags  |=AI_ADDRCONFIG;
#endif
  b.ai_family=PF_UNSPEC;
  b.ai_protocol=PF_UNSPEC;
  b.ai_socktype=SOCK_STREAM;
  int i=getaddrinfo(d,0,&b,&a);
  if(i<0){
    fprintf(stderr,"error (%d/0x%x) - %s\n\n",i,i,gai_strerror(i));
    return i;
  }
  addrinfo* p=a;
  while(p){
    if(p->ai_family==AF_INET || p->ai_family==AF_INET6){
      void* ipaddr;
      if(p->ai_family==AF_INET){  // for IPv4
        ipaddr=&(((sockaddr_in*)p->ai_addr)->sin_addr);
        i=sizeof(in_addr);
      }else{  // for IPv6
        ipaddr=&(((sockaddr_in6*)p->ai_addr)->sin6_addr);
        i=sizeof(in6_addr);
      }
      hostent* h=gethostbyaddr((char*)ipaddr,i,p->ai_family);
      char* name;
      if(!h){
        switch(h_errno){
          case HOST_NOT_FOUND:name="*name not found*"  ;break;
          case NO_RECOVERY   :name="*dns server error*";break;
          case TRY_AGAIN     :name="*dns server busy*";
        }
      }else name=h->h_name;
      char s[INET6_ADDRSTRLEN];
      printf("%s\t%s\t%s\n",p->ai_family==AF_INET?"IPv4":"IPv6",inet_ntop(p->ai_family,ipaddr,s,INET6_ADDRSTRLEN)?s:"inet
_ntop() - error",name);
    }
    p=p->ai_next;
  }
  freeaddrinfo(a);
  return 0;
}

nie wiem pod jaki system i w jakim jezyku chcesz to zrobic, wiec opisze jak to wyglada od strony posiksowej (i w c):

tworzysz sobie socket w ktorym umieszczasz ip szukanego hosta a potem rozwijasz to ip do nazwy za pomoca gethostbyaddr(). stworzyc socket mozesz dowolnie, tu uzylem akurat gethostinfo, bo mozesz podac i ip w postaci tekstowej i nazwe kanoniczna. poza tym gethostinfo tworzy gotowe sockety do dalszego wykorzystania. przy nazwie kanonicznej tworzona jest cala lista socketow z ip do ktorych revdns rozwiazal nazwe (sprawdz irc.ircnet.pl albo www.microsotft.com - przy mikrosofcie u mnie zawsze zwraca 'dns busy'). tyle ze jesli chcesz swobodnie mozesz uzyc gethostbyname() z tym samym zalozeniem ze ip podajesz w formie tekstowej. co do domeny... obcinasz po prostu pierwszy czlon nazwy, o ile nazwa zostala rozwiazana prawidlowo.

rownie dobrze mozesz wypelnic sam sockaddr_in. bo to zadna filozofia.

sockaddr_in a;
a.sin_addr.s_addr=inet_addr("127.0.0.1"); // albo inet_aton("127.0.0.1",&a.sin_addr);
hostent* h=gethostbyaddr((char*)(&a.sin_addr),4,AF_INET);
// dalej jak wyzej
0

Thanx za pomoc, ale mam jeszcze jeden mały problemik.
Juz wczesniej kombinowalem z gethostbyname ale za każdym razem jak próbowałem skopiować, wyswietlić lub w jaki kolwiek sposob użyc h_name to program się wieszał. Pewnie coś robię zle tylko nie wiem co.
Co do kompilatora to korzystam z dev'a.

1 użytkowników online, w tym zalogowanych: 0, gości: 1