C++ Üzerinde Soket Programlama

bind(skt,(struct sockaddr *)&bilgiler , sizeof(struct sockaddr) );

Evet, aldığı ilk parametre tabi ki soketimiz, ikinci parametre ise bilgileri taşıyan yapımızın adresi, asla yapının kendisi bir fonksiyona parametre olarak geçilmez. Aynı şekilde dizilerde geçilmez. Hatta dizilerin adının dizinin başlangıç adresi olması hikayesi de bu sebeptendir. Dennis amcam C yi ilk yazdığında struct diye bir şey henüz yoktu, büyük veri yapıları dizilerdi ve fonksiyonlara büyük veri yapıları geçirileceği zaman sorun olacağı için (gereksiz blok kopyalama ve çok önemli bir sorun daha) veri yapısının adını parametre olarak yazıp tüm verileri  yönetmeyi düşünmüş. Ne akıllı bir adam J

Konuyu bir hayli dağıttıktan sonra son parametreye dönelim.Gördüğünüz gibi son parametre ikinci parametrenin boyutunu alıyor. Direkt 16 da yazılabilridi ama size tavsiyem her zaman sizeof kullanın, sadece bunun için değil en basitirnden fwrite de dosyaya veri yazarken bile fwrite(tmp,sizeof(char),n,dosya) gibi kullanın. Böylece o parametrenin hangi amaçla kullanıldığını çok rahat görürsünüz ve kodu anlamanız kolaylaşır.

Son olara neden (struct sockaddr*) diye tür dönüşümü yapıldığını düşünenler için demin yazdığımı tekrarlayım. Aslında soket bilgilerini tutan yapı sockaddr dir, sockaddr_in onun sonradan yazılmış bir versiyonudur, bu yüzde parametre olarak geçerken adresini sockaddr türüne çevirmekte yarar var.

Aslında bakarsanız tek yararı derleyicinin uyarısını kesmek. Ama olsun siz iyi bir programcı olun ve tür dönüşümünü yapmayı ihmal etmeyinJ

Bind fonksiyonunu anladık ancak şunu belirmeliyim. Bind fonksiyonu eğer bir portu dinleyeceksek yani sunucuysak kullanılır. Eğer istemciysek yani belli bir adrese bağlanmak ise amacımız bind işlemi ile soketimiz ve yapımızı birleştirmemize gerek yoktur. Bunun yerine soketimizi ve yapımızı tıpkı bind fonksiyonundaki gibi connect fonksiyonuna yollarız, gerisini connect halleder ;)

connect(skt, (struct sockaddr *)&bilgiler,sizeof(struct sockaddr) );

bind fonksiyonumuza ne kadar benziyor dimi, aslında tek fark adıymış gibi duruyor. Connect fonksiyonu bilgiler yapısında aldığı sunucuya aynı yapıdan aldığı port üzerinden bağlantı isteği gönderir. Eğer o sunucuda o portu dinleyen bir program varsa bizim bağlantı isteğimiz kabul edilir ve artık veri alışverişi aşamasına gelmiş bulunuruz..

Olaya biraz da sunucu tarafından bakalım. Sunucu denilen programın tek yaptığı belli bir portu sürekli dinlemek ve kendisine bağlantı isteği gelirse bu isteği kabul etmektir.

Yani dinlemek=listen, kabul etmek=accept…

Evet bir portun açık olması bir anlam ifade etmez, önemli olan o portu dinleyen bir programın bulunup bulunmamasıdır. Portu dinlemek için kullanılan fonskiyonumuz;

listen(skt,baglanti_sayisi);  

Kolay görünüyor değilmi, öyle de.. skt bizim dinlemek için kullanacağımız soket, ancak burada dikat edin soket bilgilerini ayrı bir parametre olarak geçmiyoruz, çünkü zaten bind fonksiyonu ile soketimizi ve yapımızı birleştirdik. Bind fonksiyonu sadece sunuculara özgüdür, ve listen işleminden önce kullanılır bunu unutmayalım..

Baglantı sayısı parametresine gelecek olursak, elbette size bağlanacak maksimum istemci sayısını sınırlamak isteyebilirsiniz. Eğer bir chat sunucusu iseniz ve sağlam bir shell hesabınız yoksa 1000 kişi odaya girdiği anda muhtemelen sunucu çökecektir, tabi bizim 1000 kişilerle işimiz yok, uygun bir değer olarak 10,20 koyabiliriz.

Evet, portumuzu dinlemeyi anladık, peki gelen bağlantıları nereden anlayacaz, nasıl kabul edecez nasıl yönetecez vs. Tabi ki accept fonskiyonu ile. Accept fonksiyonu listen ile dinlenen sunucuya bir bağlantı isteği geldiğinde bu isteği kabul eder. Bağlantı istekleri bir kuyruk ta tutulur ve accept fonksiyonu çağırılıncaya kadar o kuyrukta bekler. Accept fonksiyonu her çağırıldığında bir bağlantı kabul edilir.

 

İntboyut=sizeof(bilgiler);

accept(skt,(structsockaddr)&bilgiler,&boyut));

Burada bilgiler yapımızın boyutunu direkt sizeof ile veremedik çünkü direkt boyutu değil boyutu tutan değişkenin bellek adresini istiyor.

Bu arada accept fonksiyonu istemciyi kabul ettikten sonra istemcinin ip, port gibi bilgilerini parametre olarak verdiğimiz bilgiler yapısına aktarır…

Accept fonksiyonunun çok önemli bir özelliği vardır. Bu fonksiyona dinleme yaptığınız soketi verirsiniz, o sokete gelen bağlantı isteğini kabul eder, daha sonra bu bağlantı isteğini yeni bir sokete aktarır.

Yani sıfırdan bir soket oluşturur ve gelen bağlantı isteğini bu sokete aktarır. Dinleme yaptığınız eski soketiniz de dinlemeye devam eder tabiki. Her yeni istemci bağlantısında sunucu da yeni bir soket açılır ve bu soket istemcinin soketine bağlanır. Artık veri alışverişi aşamasına gelinmiştir.

Tarih:
Hit: 10580
Yazar: Tugberk



Yorumlar


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