10 Ağustos 2017 Perşembe

Ağ Arayüzleri

Not : Konuyla ilgili olarak ifconfig ve Address Resolution Protocol başlıklı yazılara göz atabilirsiniz.

Giriş

Aslında ben de hiç network device driver yazmadım ancak konu ilgilim çektiği için aldığım bazı notları yazıyorum.

How do user-space programs interact with a USB 802.11 Wi-Fi driver on Linux? başlıklı soruda bir sürücünün kendisini kernel network interface listesine eklemesi için register_netdevice metodunu çağırması gerektiği yazıyor. Interface listesine eklendikten sonra ağ arayüzü ipconfig gibi komutlar ile yönetilebilir hale geliyor.

register_xxx ile başlayan metodlar driver'ları kernel'a tanıtmak için kullanılıyorlar.
How A Device Link To Driver In Linux sorusunda da karakter tabanlı bir sürücünün register_chrdev metodunu kullandığı yazılı.

register_chrdev() ile tanıtılan bir sürücü unregister_chrdev() metodu ile kaldırılıyor.

Ağ Arayüz İsimleri
Her ağ arayüzünün bir ismi vardır. Linux dünyasında arayüz isimleri değişti. Eskiden eth0 gibi isimler verilirken artık enp0s3 gibi isimler veriliyor. Linux dünyasında ağ arayüzlerini dolaşmak için getifaddrs() metodu kullanılıyor. Bu metod bir arayüzün Layer 3 hem de Layer 2 bilgilerini ayrı ayrı veriyor. Ağ arayüzleri Windows'ta görmek için netsh komutu kullanılır.z

MAC Adresini Alma
Windows
Windows'ta GetAdapterAddresses kullanılır. Linux'tan farklı olarak bu metod Layer 2 ve Layer 3 bilgisini beraber verir.

Linux
İki yöntem var. Birincsi getifaddrs(), ikincisi ise ioctl() metodları

getifaddrs metodu
getifaddrs metodu yazısına taşıdım.

ioctl
ioctl metodu SIOCGIFHWADDR ile kullanılırsa MAC adresi bulunabilir. ioctl başlıklı yazıya bakabilirsiniz.

Java
NetworkInterface sınıfı kullanılır.

Yöntem 1
NetworkInterface.getNetworkInterfaces() metodu ile istenilen arayüz nesnesi bulunur. Daha sonra getHardwareAddress() ile MAC adresine erişilebilir.
Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces();
while (e.hasMoreElements()) {
 NetworkInterface nis = e.nextElement();

Yöntem2
Arayüz isim ile bulunur
NetworkInterface ni = NetworkInterface.getByName("eth1");

Yöntem 3
getLocalHost ile PC'nin arayüzü bulunur. 1'den fazla ağ arayüzü varsa bu yöntem karışıklığa sebep olabilir.
InetAddress ip = InetAddress.getLocalHost();
NetworkInterface network = NetworkInterface.getByInetAddress(ip);
byte[] mac = network.getHardwareAddress();

StringBuilder sb = new StringBuilder();
for (int i = 0; i < mac.length; i++) {
sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : ""));
}
System.out.println(sb.toString());
C#
Ağ Arayüzleri yazısına taşıdım.

IP Adreslerini Alma
Hemen her ağ arayüzünün IP adresi bulunur. Bu adresi almak örnekleri aşağıda.

Linux
getsockname metodu yazısına taşıdım.


QT
ipconfig ile alınan bilgiyi Qt kullanarak çekmek te mümkün. Örneği buradan aldım.QNetworkInterface
sınıfı kullanılıyor.

Bir diğer örnekte ise 127.0.0.1 veya 192.168.1.1 gibi olmayan bir IP adresi çekme örneği var.

Java
NetworkInterface sınıfı ile QT'de olduğu gibi ağ arayüzleri alınabiliyor.

VxWorks
ifAddrGet() ile ismi bilinen bir arayüzün ip adresi alınabiliyor. Örnek:
#include <stdlib.h>
#include <stdio.h>
#include "inetLib.h"
#include "ifLib.h"

void print_if_address (void);

void print_if_address ()
{
    char if_name[] = "dhcp";
    char ip_address[INET_ADDR_LEN] = {0};

    ifAddrGet (if_name, ip_address);

    printf ("%s\n", ip_address);
}

C#
Ağ Arayüzleri yazısına taşıdım.

IP Adresi Atama
Bazen statik bir IP adresi atamak isteriz.
C#  
Ağ Arayüzleri yazısına taşıdım.

Arayüzün Bağlı Olduğunu Anlama
Ağ Arayüzleri yazısına taşıdım.

Hiç yorum yok:

Yorum Gönder