24 Şubat 2014 Pazartesi

DNS Metodları

Kendi Sunucumuzun İsmini Bulma
gethostname
Bu metod ile kendi sunucumuzun ismini bulabiliriz. Örnek:

Yukarıdaki örnekte 80 karakterlik yer ayrılmış. Ancak HOST_NAME_MAX macrosu kadar yer ayırmak yeterli. Böylece farklı platformlarda bile çalışan bir kod yazmış oluruz.

Java
InetAddress.getHostName() metodu ile yapılır.

C#
Environment.MachineName ile bulunabilir.

Kendi Sunucumuzun IP Adresini Bulma
Bir sunucunun birden fazla IP adresi olabilir!
C#
DNS.GetHostEntry metodu kullanılır. Eğer string boş verilirse kendi IP adres veya adreslerimizi buluruz.
IPHostEntry ipHostEntry = Dns.GetHostEntry(string.Empty);
    
Sadece Metin Domain İsmi ile Bulma
gethostbyname - superseded by getaddrinfo
Örnek:
struct hostent *hent = gethostbyname ("hostname");
hostent veriyapısı ise aşağıda.

hostent veriyapısının h_addr_list alanı char** olarak görünse de aslında bir struct in_addr listesi.
Aşağıdak örnekte hostent veriyapısını dolaşma gösterilmiş. 

 Bir başka örnekte ise h_addr_list listesinin ilk elemanı kullanılmış.
struct hostent *h=gethostbyname("localhost");
if(!h) {return;}
struct sockaddr_in channel;
memset(&channel,0,sizeof(channel));
channel.sin_family=AF_INET;
memcpy(&channel.sin_addr.s_addr, h->h_addr, h->h_length);
channel.sin_port=htons(SERVER_PORT);

gethostbyname_r - superseded by getaddrinfo
gethostbyname statik bellek alanı kullandığı için kullanımı tavsiye edilmiyor. Bunun yerine gethostbyname_r kullanılabilir. Aşağıdaki örnekte hata kontrolü yok: Metoda geçilen hostbuf ve result parametrelerinin farkını ben de tam anlamadım.

string hostname = "myhost";
struct hostent hostbuf;
struct hostent *result;
int herr;

int tmplen = 1024;
char *tmp = malloc (tmplen);//tamponun büyüklüğünün yeterli olup olmadığını kontrol etmiyoruz
int hres = gethostbyname_r (hostname.c_str(),&hostbuf,tmp,tmplen,&result, &herr);

if (ret == 0 && result != NULL) //Hata yoksa
{

    char** pAddr = result->h_addr_list;
    while(*pAddr)
    {
        //(*pAddr)[0],(*pAddr)[1] ile ip adresini al
        ++pAddr;
    }
}
free(tmp);
inet_ntoa
Bu metod IPv4 için çalışır. Verilen binary IP adresini "192.168.1.2" örneğindeki gibi metne çevirir. İmzası
char *inet_ntoa(struct in_addr in); 
şeklindedir.
   
Metin Domain İsmi veya Metin IP ile Bulma 
getaddrinfo - posix
getaddrinfo verilen metini (isim veya IP adresi) binary formata çevirir. Döndürülen result listesi freeaddrinfo() ile silinmelidir, yoksa memory leak olur. Örnek:

struct addrinfo* result = NULL;

//set hints
struct addrinfo hints;
memset(&hints, 0, sizeof(struct addrinfo));
hints.ai_family = AF_INET;

getaddrinfo("localhost"//hostname
            NULL//port
            &hints, //hints
            &result
            );

for(struct addrinfo *res = result; res != NULL; res = res->ai_next)
{
    struct sockaddr_in* saddr = (struct sockaddr_in*)res->ai_addr;
}
       
if (result)
{
    freeaddrinfo(result);
}   
inet_addr
Verilen IP metnini binary formata çevirir. Örnek:
struct sockaddr_in  sin;
memset(&sin,0,sizeof(sin));
sin.sin_family=AF_INET;
sin.sin_port=htons(1234);
sin.sin_addr.s_addr = inet_addr("10.0.0.1");
if(sin.sin_addr.s_addr == INADDR_NONE){} //Error 

Java
İsmi verilen bir sunucunun IP adresini bulmak için InetAddress.getByName() metodu kullanılır.  Parametre olarak domain ismi veya IP verilebilir. Eğer parametre boş bir string ise "localhost" döner.
InetAddress address = InetAddress.getByName("SERVER_IP");//IP veya hostname verilir
Kendi makinemin adresini bulmak için getLocalHost metodunu kullanabilirim. Örnek:


Metin IP Adresini Long'a Çevirme

inet_aton - deprecated. Use inet_pton
Verilen metin IP adresini long'a çevirir. Örnek:

inet_pton
Verilen metin IP adresini long'a çevirir.

Long'u Metin IP adresine çevirme

inet_ntoa - deprecated. use inet_ntop
Örnek yaz.

inet_ntop
Verilen long'u string'e çevirir. Örnek:

PING ICMP
Java
Java'da Ping yapabilmek için kolay bir yöntem yok. InetAddress.isReachable () metodu eğer çalıştıran program root ise ping gönderir, değilse değilse ping göndermez bunun yerine port 7'ye TCP Echo gönderir.


Hiç yorum yok:

Yorum Gönder