Unix Soketi - Yapılar

Unix Soket Programlamada adres ve bağlantı noktası hakkındaki bilgileri ve diğer bilgileri tutmak için çeşitli yapılar kullanılır. Çoğu soket işlevi, argüman olarak bir soket adres yapısına bir işaretçi gerektirir. Bu bölümde tanımlanan yapılar İnternet Protokol Ailesi ile ilgilidir.

Sockaddr

İlk yapı soket bilgilerini tutan sockaddr'dir -

struct sockaddr {
   unsigned short   sa_family;
   char             sa_data[14];
};

Bu, soket işlevi çağrılarının çoğunda geçirilecek olan genel bir soket adres yapısıdır. Aşağıdaki tablo üye alanlarının açıklamasını sağlar -

Öznitelik Değerler Açıklama
sa_family

AF_INET

AF_UNIX

AF_NS

AF_IMPLINK

Bir adres ailesini temsil eder. İnternet tabanlı uygulamaların çoğunda AF_INET kullanıyoruz.
sa_data Protokole özgü Adres 14 baytlık protokole özgü adresin içeriği, adres tipine göre yorumlanır. İnternet ailesi için, aşağıda tanımlanan sockaddr_in yapısı ile temsil edilen port numarası IP adresini kullanacağız .

Sockaddr içinde

Soketin elemanlarına başvurmanıza yardımcı olan ikinci yapı aşağıdaki gibidir -

struct sockaddr_in {
   short int            sin_family;
   unsigned short int   sin_port;
   struct in_addr       sin_addr;
   unsigned char        sin_zero[8];
};

Üye alanlarının açıklaması aşağıdadır -

Öznitelik Değerler Açıklama
sa_family

AF_INET

AF_UNIX

AF_NS

AF_IMPLINK

Bir adres ailesini temsil eder. İnternet tabanlı uygulamaların çoğunda AF_INET kullanıyoruz.
sin_port Servis Portu Ağ Bayt Sırasında 16 bitlik bir bağlantı noktası numarası.
sin_addr IP adresi Ağ Bayt Sırasında 32 bitlik bir IP adresi.
sin_zero Kullanılmamış Bu kullanılmadığından bu değeri NULL olarak ayarlarsınız.

adresinde

Bu yapı sadece yukarıdaki yapıda bir yapı alanı olarak kullanılır ve 32 bit netid / hostid tutar.

struct in_addr {
   unsigned long s_addr;
};

Üye alanlarının açıklaması aşağıdadır -

Öznitelik Değerler Açıklama
s_addr servis bağlantı noktası Ağ Bayt Sırasında 32 bitlik bir IP adresi.

ev sahibi

Bu yapı, ana bilgisayarla ilgili bilgileri tutmak için kullanılır.

struct hostent {
   char *h_name; 
   char **h_aliases; 
   int h_addrtype;  
   int h_length;    
   char **h_addr_list
	
#define h_addr  h_addr_list[0]
};

Üye alanlarının açıklaması aşağıdadır -

Öznitelik Değerler Açıklama
h_name ti.com vb. Ev sahibinin resmi adıdır. Örneğin, tutorialspoint.com, google.com vb.
h_aliases TI Ana bilgisayar adı takma adlarının bir listesini tutar.
h_addrtype AF_INET Adres ailesini içerir ve İnternet tabanlı uygulama durumunda her zaman AF_INET olacaktır.
h_length 4 İnternet Adresi için 4 olan IP adresinin uzunluğunu tutar.
h_addr_list in_addr İnternet adresleri için, h_addr_list [0], h_addr_list [1] ve benzeri işaretçiler dizisi in_addr yapısının işaretleridir.

NOTE - h_addr, geriye dönük uyumluluğu korumak için h_addr_list [0] olarak tanımlanır.

hizmetçi

Bu özel yapı, hizmet ve ilgili bağlantı noktaları ile ilgili bilgileri tutmak için kullanılır.

struct servent {
   char  *s_name; 
   char  **s_aliases; 
   int   s_port;  
   char  *s_proto;
};

Üye alanlarının açıklaması aşağıdadır -

Öznitelik Değerler Açıklama
adı http Bu, hizmetin resmi adıdır. Örneğin, SMTP, FTP POP3 vb.
s_aliases ALIAS Hizmet takma adlarının listesini tutar. Çoğu zaman bu NULL olarak ayarlanacaktır.
spor 80 İlişkili bağlantı noktası numarasına sahip olacaktır. Örneğin, HTTP için bu 80 olacaktır.
s_proto

TCP

UDP

Kullanılan protokole ayarlanmıştır. İnternet hizmetleri, TCP veya UDP kullanılarak sağlanır.

Soket Yapılarıyla İlgili İpuçları

Soket adres yapıları, her ağ programının ayrılmaz bir parçasıdır. Onları tahsis ediyoruz, dolduruyoruz ve onlara çeşitli soket işlevlerine işaretçiler gönderiyoruz. Bazen bu yapılardan birine bir soket işlevine bir işaretçi aktarırız ve bu, içeriği doldurur.

Bu yapıları her zaman referans olarak iletiriz (yani, yapının kendisine değil, yapıya bir işaretçi iletiriz) ve her zaman yapının boyutunu başka bir argüman olarak iletiriz.

Bir soket işlevi bir yapıyı doldurduğunda, uzunluk da referans olarak iletilir, böylece değeri işlev tarafından güncellenebilir. Bunlara değer-sonuç argümanları diyoruz.

Her zaman, bzero () işlevleri için memset () kullanarak yapı değişkenlerini NULL (yani '\ 0') olarak ayarlayın, aksi takdirde yapınızda beklenmedik önemsiz değerler alabilir.