[Çözüldü]C++ ile Linux socket programlama

Başlatan encryption, 28 Haziran 2010 - 13:07:05

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

encryption

Bu konuda Türkçe `belge` bulamadım.Türkçe dökümanların hepsi C dilinde.Elinde bu konu hakkında Türkçe `belge`ı olan var mı?

// Edit: İngilizce olmasıda sorun değil.C++ olsun yeter.Her yerde C var :(

PRoMaX

RAW SOKET PROGRAMLAMA
Sun(TM), "socket" kavramini, "agda calisan iki program arasindaki iki
yonlu haberlesme baglantisinin bir taraftaki sonlanici noktasi" olarak tanim-
lar. Her soket bir portla iliskilidir.  Boylece TCP katmani verinin yollanaca-
gi ve alinacagi uygulamayi bulabilir. Network programcilari bilirler; bir
network baglantisi acmak istedigimizde once, o baglantiya ozel bir "soket"
olusturur ve bundan sonraki TCP yada UDP alis verisimizi bu soket descriptor'u
uzerinden yapariz.
   

   Fakat "normal" soketler bizleri tamamen ozgur kilmiyor. Soketleri
normal modunda kullandigimiz zaman yapabilecegimiz cogu seyi yapamiyoruz. Ne
gibi?

   1. ICMPv4, IGMPv6 gibi IP paketlerini yazamiyor ve okuyamiyoruz. Eger
sadece "normal" soketlerle yasiyor olsaydik ping programini nasil yazacaktik?

   2. Bazi isletim sistemi cekirdekleri, IPv4 protokol field'i ICMP, IGMP,
TCP veya UDP olmayan paketleri islemiyorlar. Ya bizim propriatery bir protoko -
lumuz varsa? Bunu nasil okuyup yazacagiz?

   Iste bunun gibi sorularimizin cevabi RAW socket'ler oluyorlar. Raw
socket'ler ile normal TCP ve UDP soketlerle yapamadigimiz cogu seyi yapabili -
yoruz. Raw socket'ler "privileged" kullanicilara, kullanici verisinin iletisimi
icin kullanilan normal soketlere nazaran,  protokole direk erisim saglamamiza
olanak sagliyor. Bunlar, mevcut protokollerin ustune kurulan protokolleri
gelistirmemizi kolaylastiriyor veya normal arabirim ile erisemedigimiz
bircok module erismemizi sagliyorlar.

   



       [ONERILER]

   Bu yaziyi okuyup anlayabilmeniz icin temel C bilgisine sahip olmaniz
onerilir. Gdb ve gcc ile daha onceden calismis olmaniz teknik olarak isinizi
kolaylastiracaktir. Ama daha once TCP/IP hakkinda detayli bir calisma yapmali -
siniz. W. Richard Stevens'in TCP/IP Illustrated I kitabini siddetle oneriyorum.
Referans'lar kisminda bu kitabi satin alabileceginiz bir link de veriyorum.
[TEMEL TCP/IP BILGILERI]

   Evet, sadece hatirlamak icin tekrar edelim. Yalniz bu bilgiler sizin
burada neler dondugunu tam olarak anlamaniz icin yeterli olmayacaktir. Onun
icin WRS'nin kitabinda ilgili bolumleri mutlaka okuyup anlamaniz gerekli.

   Butun ag protokolleri gibi, TCP/IP de katmanli bir yapidadir. Her
katman iletisimin baska bir yanini yurutmekle yukumludur. TCP/IP'de dort katman
vardir.
TCP/IP protokolu katmanlari.


   Socket kullanan uygulamaniz biraz veri yolladiginda, bu paket TCP
katmanina verilir. TCP katmani uygulamanin soket'ine ait port numarasi ve karsi
makinadaki uygulamanin port numarasini ve bunun gibi kendi katmanina ait
bilgileri yazdiktan sonra IP katmanina verilir. IP katmani da paketin onune
kendi basligini ekler, ve paketin hangi IP adresinden geldi ve hangi IP
adresine gidecegi gibi bilgileri paket'in icine yazar, paketi network'e
birakilmak uzere 1. layer olan Link Layer'a verir. Link katmani da mac adresi
ve protokol bilgilerini yazdiktan sonra paketi network'e birakir. Ayni sekilde,
her gelen paket de, her layer de "demultiplex" edile edile paketin asil sahibi
uygulamaya teslim edilir.


   1. LINK KATMANI   
   TCP/IP katmanlarindan ilkidir, paket ag'dan makinaya kabul edildiginde
ilk bu katmana ugrar. Link katmaninin gorevi sunlardir:
   a) IP katmani icin datagramlarini almak/yollamak
   b) ARP katmani icin ARP request ve reply'larini almak/yollamak
   c) RARP modulu icin RARP requestleri

   Link katmanininda kullanilan aygita gore bu katmanin uzunlugu boyutu
degisir. Bazi cok kullanilan Link katmani protokolleri arasinda (Ethernet, PPP, ATM ve SLIP'i sayabiliriz).

   2. NETWORK KATMANI
   TCP/IP katmanlarinin ikincisidir ve ag baglantilarini handle eder.
Uzunlugu genelde 20 byte'dir. Asagida  genel kullanimda bir IP basligi
field'lari verilmistir.

IP Header field'lari
/usr/include/ip.h 'dan

struct ip {
u_int   ip_hl:4,                /* header length */
ip_v:4;
u_char  ip_tos;                 /* type of service */
u_short ip_len;                 /* total length */
u_short ip_id;                  /* identification */
u_short ip_off;   
u_char  ip_ttl;                 /* time to live */
u_char  ip_p;                   /* protocol */
u_short ip_sum;                 /* checksum */
struct  in_addr ip_src,ip_dst;  /* source and dest address */
};


Field            Uzunluk      Ornek
   ------------------------------   ---------------   -------------------
   Versiyon         4 bit      4
   Baslik uzunlugu      4 bit      5
   Type of Service      8 bit      0
   Toplam uzunluk      16 bit      40
   Identification      16 bit      8123013
   Flags         3 bit      0
   Fragment Offset      13 bit      0
   Time to Live (a.k.a TTL)   8 bit      64
   Protokol         8 bit      6 [TCP]
   Checksum         16 bit      0x3a43
   Kaynak IP adresi      32 bit      
   Hedef IP adresi      32 bit

3. TRANSPORT katmani      
   Bu katman da ag verisinin programlardan alinip, programlara ulastirila
bilmesi icin gerekli fonksiyoneliteye sahiptir. TCP ve UDP protokolleri bu
katmanda yer almaktadirlar. UDP, basit ve guvenilirligi olmayan bir datagram
protokoludur. TCP ise tam tersine, daha kompleks ve guvenilirligi yuksek
bir Transport Katmani protokoludur. Transport katmaninda hangi protokolun
calisacagi, Network katmaninda IP paketinde protokol field'i icinde belirtil-
mektedir.
   
   Asagidaki tablolarda UDP ve TCP protokollerinin protokol header'leri
verilmistir, inceleyiniz.

UDP protokolu field'lari:
/usr/include/netinet/udp.h 'dan

seklinde devam etmesi lazim
Tam hatirlamiyorum ama en kisa zamanda dokumani bulup vericem sana bir web sayfasinda anlatimi vardi o sayfayi bulayim sana veririm      
CLimitData * CLimitData::getInst(void)
{
   if (limitdata==NULL)
   {
      limitdata=new CLimitData();
   }

   return limitdata;

}

encryption

Arkadaşlar c++'da socket oluşturma c'dekiyle birebir aynıymış.Denediğimde farkettim.Socket programlama hakkında http://ileriseviye.org/arasayfa.php?inode=html_tr/index.html buraya bakabilirsiniz.