Winsock Uygulaması

* Makalede anlatılanlar Visual Basic 6.0 Service Pack 6’da denenmiştir.

Visual Basic kullananlar bilir ki toolbox (soldaki araç kutusu) üzerinde sağ tuşla tıklayarak “Components…” menüsüne tıklayarak araçlarımıza yeni bileşenler ekleyebiliriz. Bunlar DLL, OCX dosyaları olup içlerinde hazırladığımız programda kullanacağımız çeşitli araçlar içerir (Progress Bar, Form 2.0, Inet vs.). İşte burada listelenen “Microsoft Winsock Control 6.0” ı araçlarımız arasına alıp formda yer verirsek bir TCP/IP ya da TCP/UDP protokollü geçişe sahip bir ağ geçişi sağlamış oluruz. Araç kutusundan Winsock’u seçip formumuza ekleyelim.

Özellikler “Properties” bölümünde yer alan RemoteHost ve RemotePort, başka bir bilgisayara bu protokol üzerinden bağlanmamız için gerekli iki önemli özellik. RemoteHost bir sunucu adı ya da ip adresi olabilir, port ise karşı tarafa verileri ileteceğimiz 0-65536 arasında olabilecek port numarasıdır. Bu bilgileri girdikten sonra kodlarımız arasına şunu yazarak bağlantıyı sağlarız:

Winsock1.Connect

Burada geçen Winsock1, Winsock için bir isim olup Özellikler menüsünden bu isim değiştirilebilir. Peki ya bağlanamazsa? Eğer bağlantı sağlanamazsa bunu anlamanın yolu uygulama ile birlikte gelen nesne_Error fonksiyonudur.

Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, _
ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, _
ByVal HelpContext As Long, CancelDisplay As Boolean)

Dim msg as Integer
msg = MsgBox("Bağlantı sağlanamıyor..", vbOkOnly, "Hatalı")

End Sub

Hata istemci tabanlı olabileceği gibi sunucu tabanlı da olabilir. Winsock uygulaması portlar arası bağlantı felsefesine dayanır. Bu durumda sunucu açık olsa bile, yerleştirebileceği bir port yoksa da hata almanız kaçınılmaz.

Bağlantıyı sağladıktan sonra veri göndermek için SendData() fonksiyonundan yararlanırız. Bu yine Winsock için belirlediğimiz ismin sonuna ilgili ek gelerek yapılır.

Winsock1.SendData( "Selam, nasıl gidiyor?" )

Peki veri geldiğinde yapacaklarımızı nerden ayarlarız. Bunun için nesne_DataArrival fonksiyonunu kullanırız. Fonksiyon sadece bir veri alımı gerçekleştiğinde çalışacaktır. Bu durumda gelen veriyi GetData() ile alırız.

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
DIM Mesaj as String
Call Winsock1.GetData(Mesaj)
End Sub

Sağlanan bir bağlantıyı kapatmak içinse yine nesne adına Close eklemesi yapıyoruz. Böylece bağlantı kesilmiş olacaktır. Bağlantıyı sunucu taraflı kesmek için de aynı komut geçerlidir.

Winsock1.Close

Şimdiye kadar anlattıklarımız İstemci (Client) ile Sunucu (Server) için ortak olması gerekenlerdi. Eğer sunucu isek öncelikle Winsock ile açtığımız portları Listen fonksiyonu ile dinlemeye almak, sonrasında gelen bağlantıyı kabul etmemize yarayan nesne.Accept( reqID ) komutu kullanılmalıdır. Yoksa bağlantı gerçekleşmez.

Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
Call Winsock1.Close
Call Winsock1.Accept(requestID)
End Sub

Burada öncelikle Close kullanmamızın nedeni, asılı kalan bağlantıyı kapatmak. Böylece bağlantı sorunsuzca sağlanacaktır. Bir bağlantı durumunu nesne.State ile almaktayız. Bu bir sayısal değere işaret edip 2 ise boş, 7 ise bağlı, 8 ise bağlantısı kesilmiş uygulamalar demektir.

Sunucu, kendisine bağlanacak client kadar porta sahip olmalıdır. Örneğin en fazla 4 kullanıcı bağlanacak bir ağ için 5000-5001-5002-5003 portları seçilebilir. İşimizi kolaylaştırması açısından Winsock uygulamamızın Index değerini 0 yaparak bir dize değeri haline getirebiliriz. Böylece 4 kullanıcıya birden mesaj atmak oldukça kolaylaşacaktır.

DIM i as Integer
For i = 0 to max_client
If Winsock1(i).State = 7 Then Winsock1(i).SendData( "Sunucu Mesajı: Hoşgeldiniz..." );
Next i

Aynı zamanda bir sunucu için localport özelliğini ayarlamayı unutmayın. Bu değer sizin clientler için açtığınız port değerine eşittir.

Yazdıklarımızı özetleyecek olursak bir sunucu açıyorsak:

sunucu.LocalPort = 2593
sunucu.Listen

Bir istemci açıyorsak:

istemci.RemoteHost = "localhost"
istemci.RemotePort = 2593
istemci.Connect

İyi kodlamalar..

Mesaj Kutusu Hazırlama

Visual Basic kullananların bazen kullanıcıya ileti vermeleri gerekebilir. Bu bir uyarı, soru ya da hata mesajı olabilir. Programı kullanarak kullanıcıya mesaj kutusu vermek için msgbox() fonksiyonundan yararlanırız. Bu komut, bir sayısal değere işaret eder. Yani bir değişkendir. İç kısımda 3 bilgi istemektedir. Aşağıda burada anlatılanı bulabilirsiniz:

Uyarı: Option Explicit kullanıldıysa kodlarımız arasında değişken öncelikle Module ya da Genel Fonksiyonlarda DIM <degisken> şeklinde belirtilmelidir.

degisken = MsgBox(“Mesaj”, ayarlamalar, “Başlık”)

Burada belirtilen ayarlamalar sayılarla belirtilir. 3 grupta ele alınır. 1. grup hangi butonların olacağı, 2. grup mesajın sol tarafındaki simge, 3. grup ise öndeğer (enter’a basıldığında çalışacak) butonu seçmemize yarar.

1. Grup Ayarları:
0- Sadece Tamam butonu.
1- Tamam ve İptal butonu.
2- Vazgeç, Yeniden Dene, Yoksay butonları.
3- Evet, Hayır, İptal butonları.
4- Evet ve Hayır butonları.
5- Yeniden Dene, İptal butonları.

2. Grup Ayarları
16- Hata İşareti
32- Soru İşareti
48- Ünlem İşareti
64- Bilgi İşareti

3. Grup Ayarları
0- 1. buton öndeğer.
256- 2. buton öndeğer.
512- 3. buton öndeğer.

Tüm grupları kullanmak zorunda değilsiniz, fakat kullanacaksanız hepsinin toplamını yazmanız gerektiğini unutmayın. Örneğin Evet Hayır sorusu soran ve soru işareti kullanılan bir mesaj kutusu hazırlayacaksak:

degisken = MsgBox("Çıkmak istiyor musunuz?", 4 + 32, "Programı Kapat")

Buradaki 4, Evet-Hayır butonlarını kullanacağımız, 32 ise soru işareti simgesi kullanılacağını ifade ediyor. Peki kullanıcıdan gelen cevabı nasıl alacağız? Bunun için mesaj kutusunun ön tarafında belirttiğimiz değişkeni kullanırız. Gelen değere göre yorumlama yaparız:

1- Tamam’a basıldı.
2- İptal’e basıldı.
3- Vazgeç’e basıldı.
4- Yeniden Dene’ye basıldı.
5- Yoksay’a basıldı.
6- Evet’e basıldı.
7- Hayır’a basıldı.

Değişkenden aldığımız veriye göre kodlarımızı yazar ve bilgiyi aldığımızda ne yapacağımızı belirleriz.