Aklımda Kalası Kelimeler

* давайте работать вместе
* Zarf ve Mazruf, Zerafet(xHoyratlık) ile aynı kökten(za-ra-fe) gelir
* Bedesten
* Suç subuta ermiştir - Suç sabit olmuştur
TcpClient etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
TcpClient etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

22 Ekim 2009 Perşembe

Biraz ağ programlama 1

  • Elimden gelirse, (aklıma da gelirse tabii) network programlama serisini yazmaya çalışırım.

    TCP, UDP nedir? IP nedir? Gibi sorularınız varsa en güzel kaynak budur. Daha ucuza sitelerde var bakın derim.

    Bir uç sistemden (sizin bilgisayarınız) diğer bir uç sisteme(ziyaret ettiğiniz siteyi barındıran sunucuya) veri gönderilmesi gerektiğinde (sizin talebiniz, sunucunun cevabı gibi veriler) gönderici uç sistem verileri segmentlere ayırır ve her segmente başlık byte ları ekler. İşte paketimiz hazır. Bu paketler bir uç sistemden yola çıktığında (http://www.harthurt.com/ adresini talep ettiğinizde ya da sayfa sizin bilgisayarınıza gelmeye başladığında) internet bulutunda bazı cihazlara (yönlendiricilere -router-) sora sora adresi bulur. Bu yolculuğa paketler, TCP/IP protokolünde belirlenen biçimlere göre kutulanır ve gönderilir. Detay.

    Basit bir çizimle web sitesini görmek için adresini internet gezginine yazdığımızda oluşan trafik aşağıdaki gibidir:

Çizim için referans: blog.monstuff.com

Bir telnet ile uzaktaki ileti sunucumuza 110 portundan bağlansaydık neler olurdu? (Yani POP3 -Post Office Protocol Version 3- bağlantısı kursaydık)
Kalın yazılmış olanlar benim komut olarak gönderdiklerim. Altlarındakilerse gelen cevaplar.


C:\Users\User>telnet mail.sunucuAdi.com 110
+OK Welcome to MailEnable POP3 Server
USER cem@sunucuAdi.com
+OK
PASS sifremBudur
+OK
STAT
+OK 3 72349
RETR 1
+OK 24045 octets
Received: from ([127.0.0.1]) with MailEnable ESMTP; Mon, 19 Oct 2009 01:57:19 +0300
Received: from 84.123.214.26 by rly2.ypf.com.ar; Mon, 19 Oct 2009 00:56:36 +0100
Message-ID: <000d01ca5046$3eb6f170$6400a8c0@incompletely>
From: "Manager Andrea Best" <shop@compusa.com>
To: <cem@tekfark.com>
Subject: Your order has been paid! Parcel NR.9704
Content-Type: text/plain
Your mail 10.130.214.77:54409->212.146.137.72:110 contains contaminated file _From_Manager_Andrea_Best___shop_compusa.com___Date_Manager_Andrea_Best___shop_compusa.com___SubjYour_order_has_been_paid__Parcel_NR.9704_/_DHL_print_label_f532c.zip_/DHL_print_label_f532c.exe with virus Packed.Win32.Krap.x, so it is dropped. virus description: http://www.viruslist/.com/en/search?VN=Packed.Win32.Krap.x

.

QUIT

+OK Goodbye
Connection to host lost.

C:\Users\User>




Demek ki 110 portunda sunucuda bekleyen uygulama benimle kendince belirli bir sırada sorulara cevap veriyor. (İleti sunucusu ile karşılıklı konuşmak ile ilgili kaynak.)

Şimdi bir socket bağlantısı kurmamız gerekecek 110 üzerinden sunucudaki uygulamaya erişebilmek için. O zaman TcpClient sınıfından bir nesne ile bu işi yapabiliriz. (Java'da Socket sınıfı)


C#
TcpClient tcpClient = new TcpClient("mail.sunucuAdi.com", 110);

Java
Socket socket = new Socket("mail.sunucuAdi.com", 110);


Hadi şimdi bağlantıyı açalım. (Zaten yapıcı metot açıyor ama olsun)

if(!tcpClient.Connected){
tcpClient.Connect("mail.sunucuAdi.com:110");
}

//ya da

IPAddress ipAdres = IPAddress.Parse("192.168.1.45");
IPEndPoint ipEndPoint = new IPEndPoint(ipAdres, 110);

if(!tcpClient.Connected)
tcpClient.Connect(ipEndPoint);

Bağlandıysak bize "+OK Welcome.........falanda filan" gelecek. Bakın müspet cevap + ile başlıyor. Demek ki menfi olanı - olacak. Eksi görürsek anlarız ki hata aldık. Peki bu gelen mesajı nasıl alacağız? Bunu da NetworkStream sınıfından bir nesne ile yapacağız(Gözünü sevdiğim Türkçe). NetworkStream nesnesi ancak bağlantılı bir socket varsa yaratılabilir(Yani NetworkStream sınıfının yapıcı metodu bir Socket nesnesi istiyor). NetworkStream ile açılan soket üzerinden stream alıp verebileceğiz (komut gönderip, yanıtlarını alabileceğiz). Peki aldığımız bu yanıtları nasıl ekrana taşıyacağız? Bunu birazdan cevaplayacağız ama önce bu soket nasıl tanımlanıyor, bağlantı nasıl açılıyor, soket bağlantısının nasıl özellikleri var diye bakalım.

İşte soket tanımlama ve bağlantı açma kısmı:

Socket socket = new Socket(
AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
socket.Connect("192.168.1.45", 110);
NetworkStream networkStream = new NetworkStream(socket);

// ya da

NetworkStream networkStream = tcpClient.GetStream();


Biliyoruzki Socket sınıfı çeşitli yapıcı metotlar ile tanımlanabiliyor. Burada dikkatinizi çekmek istediğim nokta şu ki;
  • AddressFamily enumu içinde IPV4, IPV6, AppleTalk v.s. gibi adres tiplerini,
  • SocketType enumu içinde Stream, Dgram, Raw v.s. gibi bağlantı tipleri ile bağlantının güvenilirmi, iki ya da daha fazla bağlantı açılıp açılmayacağını, başlangıçta bir bağlantının gerekli olup olmadığı gibi bilgileri barındıran soket tipini,
  • ve ProtocolType enumu içinde bu bağlantı üzerinde hangi protokolü kullanacağımızı belirliyoruz.


Yani bir soket için bu üç bilgiye ihtiyacımız olduğuna dikkat etmeliyiz.

AddressFamily
SocketType
ProtocolType



Burada dikkat etmemiz gereken, ileti sunucusunun 110 portu ile kendi makinemizin 57579 portuna soket bağlantısı kurulmuş olmasıdır. Bu soket bağlantısını da 1688 Handle ile windows aklında tutuyor.