10 Ağustos 2017 Perşembe

ioctl

Giriş

ioctl ile sistem hakkında bir çok bilgi almak mümkün. Kullandığım bazı şeyleri not etmek istedim.

Ağ ve Arayüz Bilgileri

1. SIOCGIFINDEX seçeneği

Verilen ethernet isminin kaçıncı arayüz numarasına denk geldiğini bulmayı sağlar. Bu numarayı kullanarak o ara yüzden raw ethernet paketi gönderebiliriz.

2. SIOCGIFCONF seçeneği
Tüm ağ arayüzlerinin listesini alır.

3. SIOCGIFHWADDR seçeneği
Verilen ethernet isminin MAC adresini alır. Şöyle yaparız.
int fd =socket(AF_INET, SOCK_DGRAM, 0);
struct ifreq ifr;
ifr.ifr_addr.sa_family = AF_INET;
strncpy(ifr.ifr_name , "eth0", IFNAMSIZ-1);
ioctl(fd, SIOCGIFHWADDR, &ifr);
close(fd);
unsigned char *mac = (unsigned char *)ifr.ifr_hwaddr.sa_data;

//display mac address
printf("Mac : %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n" ,
  mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);

4. SIOCGIFADDR seçeneği
Verilen ethernet isminin IP adresini alır.
Tüm ethernet kartlarının IP adresini almak için Java'da aşağıdaki kod çalıştırılır.

String hostName = InetAddress.getLocalHost().getHostName();
InetAddress addrs[] = InetAddress.getAllByName(hostName);
for (InetAddress addr : addrs) {
    System.out.println("addr.getHostAddress() = " + addr.getHostAddress());//10.126.102.63
}
Bir diğer yöntem ise
InetAddress addrs = InetAddress.getLocalHost();
System.out.println("Current IP address : " + addrs.getHostAddress());
5. SIOCGARP seçeneği
Verilen ethernet isminin MAC adresini alır ARP tablosundan alır. Örnek:

//read an entry from the ARP cache of the local machine.
static char *ethernet_mactoa(struct sockaddr *addr)
{
    static char buff[256];
    unsigned char *ptr = (unsigned char *) addr->sa_data;
    sprintf(buff, "%02X:%02X:%02X:%02X:%02X:%02X",ptr[0],ptr[1],ptr[2],ptr[3],ptr[4],ptr[5]);
    return (buff);
}

//Get a socket
int s = socket(AF_INET, SOCK_DGRAM, 0);

struct arpreq areq;
memset(&areq, 0, sizeof(areq));
struct sockaddr_in *sin = (struct sockaddr_in *) &areq.arp_pa;
sin->sin_family = AF_INET;
sin->sin_addr = inet_addr("192.168.2.1");


ioctl(s, SIOCGARP, &areq);
ethernet_mactoa(&areq.arp_ha);

TCP/UDP Bilgileri

1. SIOCOUTQ (TIOCOUTQ)
Örnek ver

2. SIOCINQ  (FIONREAD)
Bu ikisi ile TCP input/output kuyruğ hakkında bilgi almak mümkün. Daha detaylı bilgi için  TCP/UDP ve Linux başlıklı yazıya göz atabilirsiniz.



Hiç yorum yok:

Yorum Gönder