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
#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
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.