Coding4ever’s Blog

Just coding… coding… and coding… because coding should be fun :)

Belajar Winsock Bagian 3 – Multiple Connection

| Comments

Di postingan saya sebelumnya kita sudah mengetahui bagai mana cara membuat aplikasi chat sederhana yang hanya melibatkan saya dan Anda :D, dan bagai mana jika ada teman saya yang lain ikut nimbrung ?

Jelas ini tidak bisa karena 1 winsock hanya bisa menangani 1 port, trus bagaimana jika kita ingin teman kita yang lain bisa konek di port yang sama dan hanya menggunakan 1 winsock? Jawabannya sederhana objek winsocknya kita jadikan array.

Oke, masukkan objek winsock ke form kemudian untuk menjadikannya sebagai objek array kita cukup mengset properties Index=0, jadi winsock dengan index 0 bertugas untuk mengecek permintaan koneksi masuk dan mengalokasikannya kepada yang berhak :) dan tentu saja untuk melakukan hal ini harus dalam mode mendengarkan/Listen

1
2
3
4
5
6
7
Private Sub Form_Load()
    With Winsock1(0)
        .Close
        .LocalPort = 11111 'nilai port ini bisa diganti
        .Listen
    End With
End Sub

Ketika ada permintaan koneksi di port 11111, kita harus menambahkan objek winsock baru untuk menerima permintaan koneksi tersebut dan karena objek winsock yang baru tidak kita set properties LocalPortnya otomatis windows yang akan memberikan nilai Port secara acak.

1
2
3
4
5
6
7
8
9
10
Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)
    'we should only be getting connection requests from
    'Index 0 because thats the only one that is listening

    'load a new winsock
    Load Winsock1(Winsock1.UBound + 1)

    'accept the incoming connection on our new control
    Winsock1(Winsock1.UBound).Accept requestID
End Sub

Fungsi UBound digunakan untuk mendapatkan nilai index terakhir dari objek array, jadi untuk mengetahui berapa jumlah objek arraynya kita cukup memanggil fungsi UBound + 1.

Solusi menggunakan winsock array diatas masih mempunyai sedikit masalah, misalkan kita sudah mempunyai 5 koneksi di port 11111 ini artinya kita sudah mempunyai 6 objek winsock yang aktif, index 0 dalam mode mendengarkan/Listen, dan 1 sampai 5 konek ke klien.

Apa yang terjadi jika 3 klien tidak terkoneksi lagi? Sebenarnya sih enggak terlalu bermasalah, masalahnya adalah jika ada klien lain yang konek ke server otomatis objek winsock baru ditambahkan lagi untuk menerima koneksi yang baru, padahal ada 3 objek winsock yang sedang nganggur/idle.

Bayangkan jika kita diminta untuk membuat aplikasi billing warnet dengan 100 klien, ada 50 klien yang sudah disconnect kemudian ada 50 klien lagi yang baru konek. Ini artinya kita mempunyai 50 objek winsock nganggur/idle yang jelas-jelas merupakan pemborosan memory dan bagai mana jika hal tersebut terulang lagi, lagi dan lagi.

Bagaimana solusinya? Yaph sebenarnya ini juga gampang, jadi jika ada permintaan koneksi dari klien kita cek dulu ada nggak objek winsock yang idle, kalo ada arahkan agar winsock yang idle tadi untuk menerima koneksi tersebut, jika tidak ada baru kita tambahkan objek winsock yang baru untuk menerima koneksi tersebut sehingga kode sebelumnya harus kita revisi menjadi :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)
    Dim i          As Long
    Dim j          As Long

    On Error GoTo errHandle

    If Index = 0 Then 'ingat yang bertugas untuk mengecek permintaan koneksi adalah objek winsock dengan index = 0
        'ini bagian yang bertugas untuk mengecek winsock yang idle
        For i = 1 To Winsock1.UBound
            If Winsock1(i).State = sckClosed Or Winsock1(i).State = sckClosing Then
                j = i   'var j menampung index winsock yang idle
                Exit For
            End If
        Next i

        'jika j = 0 berarti semua winsock kepakai, otomatis kita harus menambahkan winsock yang baru
        If j = 0 Then
            Call Load(Winsock1(Winsock1.UBound + 1))
            j = Winsock1.UBound
        End If

        'terima koneksi yang baru
        With Winsock1(j)
            Call .Close
            Call .Accept(requestID)
        End With

    End If

    Exit Sub

errHandle:
    Call Winsock1(0).Close
End Sub

Yaph cukup itu saja, contoh programnya bisa didownload disini.

Artikel berikutnya insya Alloh dengan judul Belajar Winsock bagian 4 – Membuat jaringan VPN sendiri.

Di artikel tersebut saya sudah tidak membahas penggunaan winsock lagi tetapi artikel tersebut dibutuhkan agar saya bisa menulis artikel terakhir dari 5 seri belajar Winsock ini yang berjudul Belajar Winsock bagian akhir – Contoh kasus mengakses data stok barang dari luar.

Dan tentunya ini bukan via web (kalo yang ini sudah enggak perlu dibahas lagi) tetapi tetap dengan mengembangkan contoh-contoh program winsock sebelumnya, dan sebagai uji coba untuk komputer server toko yang akan diakses menggunakan speedy sedangkan saya menggunakan starone dan mudah-mudahan saja uji coba ini berhasil :).

Selamat mencoba :)

Comments