Üye Girişi
x

Giriş Başarılı.

Yanlış Bilgiler.

E-mail adresinizi doğrulamalısınız.

Facebook'la giriş | Kayıt ol | Şifremi unuttum
İletişim
x

Mesajınız gönderildi.

Mesajınız gönderilemedi.

Güvenlik sorusu yanlış.

Kullandığınız Sosyal Medyayı Seçin
Yeni Klasör 8 yıldır sizin için en güvenli hizmeti veriyor...

Teknoloji dünyasındaki son gelişmeler ve sürpriz hediyelerimiz için bizi takip edin.

BEEJ'in Network Programlama Rehberi

> 1 <

blackwolf

grup tuttuğum takım
Çavuş Grup
Hat durumu Cinsiyet Özel mesaj 254 ileti
Yer: izmir
İş: bilg. müh.
Kayıt: 06-08-2006 13:33

işletim sistemim [+][+3][+5] [-]
kırık link bildirimi Kırık Link Bildir! #111934 08-08-2006 18:48 GMT-1 saat    
BEEJ'in Network Programlama Rehberi

Internet altında çalışan yazılımları her gün kullanıyoruz ve belki de çoğumuz böyle programlar yazmak için yanıp tutuşuyor. İşte yangın söndürücünüz geldi. Daha önce network programlama ile uğraşan insanlara bu işi öğrenmem için kimi tavsiye edersiniz diye sorarsanız beej'i gösterecektir. Bu şahıs network programlama üzerine çok güzel bir giriş yapmış ve olayın temelini oldukça akıcı bir biçimde esprilerle anlatmış. Biz de bu yazıyı çevirirken mümkün olduğunca esprili bir biçimde ve özünü koruyarak çevirmeye çalıştık. Gramer ve çeviri olarak yanlışlarımız olabilir. Lütfen bizi uyarmaktan çekinmeyin. Bu yazının orjinalini

bağlantıyı göster (facebook ile) bağlantıyı göster (klasik üye girişi ile) adresinde bulabilirsiniz. Umarım bu yazı hepinize faydalı olur...
GİRİŞ


Manual dosyaşarı arasında kaybolmuş programcılara müjde! Ben bu sıkıcı işi hallettim ve sizinle bilgimi paylaşmak için yanıp tutuşuyorum! Bu yazının ortalama düzeydeki bir c programcısına network programlama üzerinde en azından bir fikir vereceğini umuyorum.

Bu dokuman sadece bir tutorial olarak yazılmıştır. Bu dokuman daha cok soket programlamaya yeni girmiş yada girmek isteyen insanlar için yazılmıştır. Baştan sona kapsamlı bir döküman değildir. Sadece socket programlamanın temellerini anlatmak için yazılmıştır.

PLATFORM ve DERLEYİCİ


Bu dokumanda bulunan kodların büyük kısmı gnu gcc kullanılarak üzerinde Linux yüklü bir pc'de derlendi ve yazıldı. Aynı zamanda HPUX (hp unix) altında gcc ile derlendi. Her küçük kod parçası tek tek test edilmedi.

İÇİNDEKİLER



* Socket nedir?

* Internet socketlerinin iki tipi

* Alt düzey saçmalığı ve Network Teorisi

* "struct" lar--bunları bilin yoksa uzaylılar dünyayı yok edecekler!

* Yerlileri Dönüştürün!

* IP adresleri ve onlarla uğraşmak

* socket()--Dosya tanımlayıcılarını (file descriptor) al!

* bind()--Hangi port üzerindeyim?

* connect()--Hey sen!

* listen()--Lütfen birisi beni ararmı?

* accept()--"3490. porttan aradığınız için teşekkürler."

* send() ve recv()--Konuş benle bebek!

* sento() ve recvfrom()--Benle DGRAM sitili konuş

* close() ve shutdown()--Yıkıl karşımdan!

* getpeername()--Kimsin sen?

* gethostname()--Ben kimim?

* DNS--Sen "cankaya.gov.tr" dersin bense 195.142.132.195

* Sunucu-İstemci arkaplanı

* Basit bir stream sunucu

* Basit bir stream client

* Datagram socketler

* Bloklama

* select()--Senkronize G/Ç çoğullama (multiplexing)

* Daha fazla referans


SOCKET NEDİR?



Soketlerden konuşulduğunu herzaman duymuşsunuzdur,belki de ne olduğunu merak ediyorsunuzdur. Kısaca şöyle açıklıyabiliriz: standart UNIX dosya tanımlıyıcılarını kullanarak diğer programlarla haberleşmenin bir yolu.

Buyur???

Tamam.Unix hackerlarının şöyle söylediğini mutlaka duymuşsunuzdur,"Unix'teki herşey bir dosyadır" Bu adamın tam olarak dediği şey Unix programlarının her hangi bir G/Ç (giriş-çıkış) işlemi yaptığında bir dosya tanımlayıcısına yazıp okuyarak yapmasıdır. Bir dosya tanımlayıcısı açık bir dosya ile ilişkilendirilmiş bir tamsayıdır. Ama bu dosya (dikkat olay burda), bir network baglantısı, bir printer, bir terminal, distekin üzerindeki gerçek bir dosya ve herhangi bir şey olabilir. Unix üzerindeki herşey bir dosyadır! Yani siz internet üzerinden bir program ile haberleşmek istediğinizde bunu dosya tanımlayıcısı ile yapmanız gerekir, ister inanın ister inanmayın.

"Network haberleşmesi için bu doya tanımlayıcısını nerden alıcam peki bay UKALA?" şu an için kafanızda ki son sorudur ama ben yine de cevaplayacagım. socket() sistem rutinini çağırmanız gerekir. Bu socket tanımlayıcısı geri döndürür, ve siz de özelleştirilmiş send() ve recv() 'i kullanarak socket üzerinden haberleşirsiniz(daha fazla bilgi için "man send","man recv").

"Dur bakalım" diye bağırıyor olabilirsiniz."Eğer bu sadece bir dosya tanımlayıcısı ise haberleşmek için neden normal read() ve write() fonksiyonlarını kullanmıyoruz?". Bunun kısa cevabı ise:"KULLANABİLİRSİN!".Uzunu ise:"Kullanabilirsin,ama send() ve recv() veri iletimi üzerinde daha çok kontrol sağlıyor."

Sırada ne var?Şuna ne dersiniz:ortalıkta bir çok socket çeşidi var.DARPA Internet adresleri(Internet soketleri),yerel düğümde dizin isimleri(unix soketleri),CCITT X.25 adresleri (X.25 soketlerini rahatca göz ardı edin,uğraşmıyacağız.), ve kullandığınız unix'e göre değişen bir çok soket. Bu doküman öncelikle Internet soketlerine giriş yapıcak.

INTERNET SOKETLERİNİN İKİ TİPİ



Bu da ne?İki tip internet soketi mi var?Evet şeyyy hayır.Yalan söyledim.Daha fazlası var ama sizi tırsıtmak istemem. Burda sadece iki tipinden bahsedeceğim. Şu cümle hariç, "Raw sockets"

de aynı zamanda çok güçlü onlarda bir ara bakmalısınız.

Pekala nedir bu iki tip? Birincisi "Stream soketler"; öbürü ise "Datagram soketler", bunlara daha sonra sırasıyla "SOCK_STREAM" ve "SOCK_DGRAM" diyeceğiz. Datagram soketler bazen "bağlantısız soketler" olarak da adlandırılır.(isterseniz connect() ile bağlantı sağlana bilir.İlerde connect()'e bakınız lütfen)

Stream soketler güvenilir iki yollu bağlanmış haberleşme akımlarıdır. Eğer bir sokete "1,2" düzeninde iki parça koyarsanız,öteki tarafa "1,2" düzeninde varacaklardır. Aynı zamanda hataya mahal vermezler. Karlışacağınız her hata sadece sizin kazana dönmüş kafanızın birer hayal ürünüdür, ve burda tartışmaya gerek yoktur!

Peki stream soketler bu yüksek düzey iletim kalitesini nasıl başarırlar? The Transmission Control Protocol (İletim kontrol protokolü) denilen ve bizim TCP diye tabir ettiğimiz protokolü kullanırlar. TCP verini hatasız ve ardışık ulaşmasını sağlar. Daha önceden "TCP" yi "TCP/IP" nin bir parçası olarak duymuşsunuzdur. "IP" internet protokolü demektir. IP internet routing ile ilgilidir.

Süüüüpeerrr. Peki ya Datagram soketler?Neden onlara bağlantısız deniyor?Onlar güvenilmez mi yoksa? Pekala, işte size bir takım gerçekler: eğer bir datagram gönderirseniz, o belki ulaşır.

Düzensiz olarak varma ihtimali vardır. Eğer varırsa , paketteki veri hatasız olacaktır.

Datagram soketlerde routing için IP kullanır ama TCP yi kullanmazlar,onlar "User Datagram Protocol" ü veya UDP kullanırlar.

Peki neden bağlantısızdırlar? Basitce, stream soketlerde yaptığınız gibi açık bir bağlantı sağlamanız gerekmez. Sadece bir paket yapın, varacağı yerin bilgisini içeren IP başlığını yapıştırıp yollayın. Bağlantıya gerek yoktur. Bunlar genellikle bilgini paket-paket gönderilmesinde kullanılır,mesela:tftp,bootp,vs.

"YETER!!!" diye bağırdığınızı duyar gibiyim. "Datagramlar kaybolursa bu programlar nasıl çalışacak???" Bak güzel kardeşim hepsinin UDP nin üzerinde kendine ait bir protokolü vardır. Mesela, tftp protokolü her paket yolladıgında kendisine bir paket yollanmasını söyler. (bir "ACK" paketi )Eğer tftp ye yolladığı pakete karşılık bir paket gelmezse mesela 5 saniye içinde, aynı paketi yeniden yollar ve en sonunda "ACK" yi alır.SOCK_DGRAM uygulamaları yaparken onay prosedürü çok önemlidir.


ALT DÜZEY SAÇMALIĞI ve NETWORK TEORİSİ

Protokollerin düzenini anlattığıma göre networklerin gerçekten nasıl çalıştığını anlatabilirim ve SOCK_DGRAM paketlerinin inşa edilmesi hakkında birkaç örnek verebilirim.

İsterseniz bu bölümü atlıyabilirsiniz.

"Data Encapsulation" olayını öğrenmeye geldi sıra.Dikkat edin bu çok önemli. Basit olarak, eğer bir paket doğarsa, paket bir başlık içinde önce ilk protokol tarafından (mesela TFTP) ambalajlanır ("encapsulation"). Bundan sonra tüm bu paket sıradaki protokol ile paketlenir(mesela UDP). Sıradaki protokol (misal IP) ile paketlenen paket hardware katmanına (ornek: ethernet) gelinceye kadar böyle paketlenir.

Paketi başka bir bilgisayar aldığı zaman,donanım sırayla önce ethernet başlığını çıkarır sonra "kernel" IP ve UDP başlıklarını çıkarır ve TFTP programıda TFTP başşlığını çıkarır ve verimiz ortaya çıkar.

Şimdi "Katmanlı Ağ Modeli"den (Layered Network Model) bahsedebilirim. Bu model diğer modellere oranla çok daha kullanışlı bir sistem tanımlar. Mesela datanın iletildiği fiziksel ortamın (seri, ethernet, AUI, ...) nasıl olduğunu düşünmeden de socket programları yazabilirsiniz. Ağ donanımı ve ağ topolojisi socket programcısı için şeffaftır.

Daha fazla ilerlemeden, size ağ katmanlarını tanıtacağım:

* Application

* Presentation

* Session

* Transport

* Network

* Data Link

* Physical

Fiziksel katman (Physical layer) donanımdır.Mesela seri, eternet falan.Uygulama katmanı (Application) fiziksel katmana düşeneceğinizden daha uzaktır. Uygulama katmanı kullanıcıların network ile karşılaştığı, etkileştiği yerdir. Bu model o kadar geneldir ki isterseniz bunu otomobil tamir rehberi olarak kullanabilirsiniz.

UNIX ile daha alakalı bir katmanlı bir model aşşağıdaki gibi olabilir:

* Uygulama Katmanı (telnet, ftp, vs.)

* Host'tan Host'a taşıma Katmanı (TCP, UDP)

* Internet Katmanı (IP ve routing)

* Ağ Ulaşım Katmanı (ağ, data link ve physical)

Zamanla bu katmanların orjinal verinin paketlenmesini nasıl yaptığını daha iyi göreceksiniz.

Küçük bir paket yapmak için ne kadar çok "ameliye" olduğunu gördünüz dimi?Stream soketler için yapmanız gereken tek şey send() ile veriyi yollamak.Datagram soketler içinse veriyi sizin seçtiğiniz bir yöntemle paketleyim sendto() ile göndermeniz yeterli olacaktır. Kernel transport, internet katmanlarını, donanım da ağ ulaşım katmanını sizin için oluşturacaktır. Ahhh ahhh modern teknoloji ahh.

Bunu ilk beğenen siz olun

Hata Oluştu


> 1 <