C++ Üzerinde Soket Programlama

shutdown (soket , nasil);

Burada soket parametresi kapatmak istediğimiz sokettir. Nasıl parametresi ise üç değer alabilir, bunları açıklamadan önce send ve recv fonksiyonları ile ilgili bir şey daha söyleyeyim.

Bu fonksiyonlar birbirlerine veriyi doğrudan iletmezler, send fonksiyonu veriyi ağ tamponuna yazar, ağ tamponunun doluluğuna göre istenilen veriyi tek seferde yazabilir ya da bir kısmını yazar.

Aynı şekilde recv fonksiyonu da veriyi ağ tamponundan okur ve 1 bayt bile okusa başarılı olur.

Bir soket shut down komutu ile kapatıldığında eğer nasil parametresine 0 yani SD_SEND değerini verirsek o soket ile veri gönderile bilir ancak veri alınamaz.

Eğer 1 yani SD_RECEIVE değerini verirsek o soketten veri alınabilir ancak veri gönderilemez..

Son olarak 3 yani SD_BOTH değerini verirsek soket çift yönlü olarak kapatılır ve artık veri alınamaz, gönderilemez, ancak shutdown ile kapatma yaptığımızda closesocket in aksine ağ tamponunda gönderilecek veya alınacak veri varsa bu veri gönderilir-alınır ve soket öyle kapatılır.

Son olarak pek sık kullanılmayan iki fonksiyonan bahsedeyim.. getpeername ve gethostname fonksiyonları.

Gethostname fonksiyonu sizin kendi sunucu adınızı öğrenmek için kullanabileceğiniz bir fonksiyon ,

int gethostname(char *sunucuadi, size_t boyut);

size_t standart bir typedef ismidir ve aslında long türüdür. Sunucuadi içi boş bir dizinin başlanıç adresi yani adıdır. Boyut ise sunucuadi dizisinin uzunluğudur.

İşlem bitince sunucu adınız artık sunucuadi dizisinde bulunmaktadır…

Getpeername fonksiyonu ise soketinizin diğer ucundaki istemci yada sunucunun adresini elde etmek için kullanılır.

int getpeername(soket, struct sockaddr *bilgiler, int *boyut);

parametreleri accept fonksiyonu gibidir, soketi ve bilgiler yapısını veririz ve fonksiyon bilgiler yapısını soketin diğer tarafındaki makinanın ip ve port değerleriyle doldurur.

Son parametre de tıpkı accept gibi bilgiler yapısının boyutudur ancak boyutunu tutan değişkenin adresini istediği için int boyut= sizeof(bilgiler) şeklinde değişkeni tanımlayıp &boyut şeklinde parametre olarak geçmelisiniz..

Evet sonunda bitti J artık sadece program yazıp açıklamalarını vereceğim. Bu yazdığım sunucuyu zaten dökümanın eklerinde kaynak kod ve derlenmiş hali olarak bulabilirsiniz, sakın kaybetmeyin, bu iki satırlık sunucu programıyla öyle bir chat programı yazacağız ki gözlerinize inanamayacaksınız  J

Evet arkadaslar bu vb de yazdıgım dandik chat istemcisi, siz sunuyucu öğrenseniz yeter istemci daha da basittir. Sunucu bağlantıları kontrol eder istemci sadece sunucu ile veri alış verişi yapar.

Açıkçası birkaç program örneği daha yapacaktık bu dökümanda ama tahribatta diğer programların kaynak kodunu paylaşacağım için gerel  kalmadı sanırım. Hem doküman da bir an önce çıkmış olur.

Ama burada önemli bir ayrıntıyı sonraki örneklerde anlatırız diye aktarmamıştım. Şimdi onu da anlatacağım. Hatırlarsanız send ve recv fonksiyonları istediğimiz verinin tamamını yollayamayabiliyordu.

İşte bu durumda konrolü biz alabilirdik. Bundan yukarda kabaca bahsetmiştim. İşte şimdi send ve recv ile istediğimiz kadar verinin yollanması yada alınması için iki klasikleşmiş fonksiyon yazacağız.

///////////////////////////////////////////////////////////////////////////

int recvx(SOCKET s, void *tmp, int toplam) {

  int sonuc;

  int i = 0;

  int gelecek = toplam;

  while (gelecek > 0) {

    sonuc = recv(s, (char *) tmp + i , gelecek, 0);

   if (sonuc == 0)

     return i;

   if (sonuc == -1) 

     return -1;

 

    i += sonuc;

    gelecek -= sonuc;

  }

  return i;

}

///////////////////////////////////////////////////////////////////////////

int sendx(SOCKET s, const void *tmp, int toplam) {

  int sonuc;

  int i = 0;

  int gidecek = toplam;

 

  while (gidecek > 0) {

    sonuc = send(s, (const char *) tmp + i , gidecek, 0);

   if (sonuc == 0)

     return i;

   if (sonuc == -1) 

     return -1;

 

    i += sonuc;

    gidecek -= sonuc;

  }

  return i;

}

Tarih:
Hit: 10591
Yazar: Tugberk



Yorumlar


Siftahı yapan siz olun
Yorum yapabilmek için üye girişi yapmalısınız.