Belajar Winsock bagian 3 – Multiple Connection
Di postingan saya sebelumnya kita sudah mengetahui bagai mana cara membuat aplikasi chat sederhana yang hanya melibatkan saya dan Anda
, 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
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.
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 :
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





Artikel-artikelnya bener2 kereeen…!!
Wah tq banget nih atas responnya
Om pernah kejadian seperti ini gax di winsock?
misal program server & client sudah terkoneksi, kemudian jika kompie (misal: server) ngehang/kerestart, maka value fungsi “state” winsock di program clientnya ga berubah (alias masih “sckConnected”, harusnyakan jadi “sckClosed”). Tapi jika program servernya diexit secara normal, value fungsi “state”nya jadi “sckClosed”.
itu kenapa ya? apakah komponen winsock 2.0 bawaan vb.6 memang mempunyai kelemahan seperti itu?
Mungkin si Om bisa mencoba event Error untuk menghandle masalah ini :
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) MsgBox "Server sedang bermasalah !!!", vbExclamation, "Peringatan" Winsock1.Close End SubSelamat mencoba
Sebelumnya saya juga sudah pernah menggunakan event error ini om, tapi “kadang” masih suka terjadi seperti itu. (jadi intinya hanya kadang2)
Terus masalah lain yang pernah saya temui yaitu: “misal program server & client sudah terkoneksi, lalu pc server saya restart, nah pada kasus ini misal program client bisa mengetahui kalo dirinya sudah tidak terkoneksi dengan server (status jadi “sckClosed”), namun yang jadi permasalahan, dalam rentang waktu pc server itu ngerestart kan proram client saya buat looping untuk melakukan koneksi ulang ke server. Nah begitu program server sudah aktif, program client malah tidak bisa terkoneksi ke server, alhasil program client harus saya exit dulu, baru bisa terkoneksi. itu kenapa ya?
ralat bagian akhir ->
alhasil program client harus saya exit dulu lalu dijalankan lagi, baru bisa terkoneksi. itu kenapa ya?
Mungkin juga seperti yg om perkirakan sebelumnya memang ada bug di winsocknya.
Sama seperti kasus yg sy temui, aplikasi seperti hang pada saat ditutup klo komputer terkoneksi ke internet pada hal kalo tidak terkoneksi ke internet lancar2x saja.
Looping koneksinya seperti ini ya ?
Private Function startConnect(ByVal ipServer As String) As Boolean On Error Resume Next If Socket.State <> sckClosed Then Socket.Close ' close existing connection Call Socket.Connect(ipServer, LOCAL_PORT) With Socket Do While .State <> sckConnected DoEvents If .State = sckError Then Exit Function Loop End With startConnect = True End FunctionTrus pengecekannya pada saat kapan? Apakah menggunakan timer atau manual pada saat menekan tombol tertentu ?
menggunakan timer om.
Klo kode perulangan untuk koneksinya udah sama ya?
Trus saran saya coba tambahkan pencatatan file log (aplikasi server) pada event ConnectionRequest, DataArrival dan Error untuk mencatat status winsocknya.
Kemudian coba restart server untuk mengetahui apakah event2 tersebut merespon request koneksi dari klien selama proses startup windowsnya.
Oke om, ya jalan terakhir harus di-log untuk mencari penyebab pastinya.
thanks ya om…
Oke om, sy tunggu sharenya klo udah case closed
Mau tanya donk teman2x?jika kita ada proxy server bagaimana kita terkoneksi antara server dan client?ada ide?
thanks bravo
Belum ada om, sy belum ngerti maksudnya
oh jadi saya kan ada server dengan IP PUBLIC, lalu client ingin mengirim data ke ip public tersebut. tetapi clientnya ini harus melalui proxy server. apakah bisa?
Saya belum pernah coba tetapi, ini ada tutorial bagus yg membahas masalah ini.
omm…saya mw nnya lagi neh
aplikasi chat client server na udah saya coba di LAN…. ( saya lupa kemaren posting di artikel yang mana )
aplikasi nya knp ga konek ya?? saya dapat pesan error “CONNECTION IS FORCEFULLY REJECTED”…itu kira2 knp yaa??? apa karna port nya?? (saya masih pake port sample yg dikasih “11111″)….atau karna hak akses nya dibatasi oleh server ( saya login tidak menggunakan administrator di pc tsb ) ?? cara ngatasi na gimna?? makasih omm
Kemungkinan masalah di firewallnya, jadi solusi yg bisa dicoba :
1. Non aktifkan windows firewall
2. atw windows firewall tetap aktif tetapi daftarkan port “11111″ nya ke window firewall
mksud na aplikasi omm yg winsock3rev1 ntu..
om,ada tutorial vb6 untuk pesan iso8583?klo ada mohon petunjuknya,terimakasih sebelumnya
Sory om belum ada
om, saya mau tanya ni
bisa ga kalau misalnya program chatnya untuk bagian IP kita pake combobox yang isinya otomatis menampilkan ip semua komputer yang sedang aktif di dalam jaringan?
Terimakasih
Yang jelas bisa om, coba dimodif contoh yg ada disini, disitu menampilkan semua klien yang aktif ke ListBox.
oke om, saya coba dulu terimakasih banyak
Sama2x om
thanks bos………….. artikelnya keren abis,,,,,,,,,,,,,,,,,,,,, makaseh bgt poko’nya… semangat coding terus gan,,,, hehehe
Oke om, tq udah mampir
om,, ane maw nanya kalo maw bkin private chat dengan vb6 source codenya gmana,,, pake winsock juga saya baru bisa buat chat room aja,, broadcase jd dikirim kesemua klien yang connect, klo buat pruvate gmana ya om,,,, mohon bantuannya…
Nah itu udah kren om bisa buat aplikasi chat room, ada aplikasi servernya enggak ?
Klo ada validasinya disitu, misal untuk broadcast ke semua klien aktif pake perintah :
Tapi untuk private pake perintah :
nah itu dya masalahnya om,,,, ane lom faham coding yang buat mgirim ke orang yang dituju… misal winsock udah listen 8 klient, trus ane dapet winsock index 1 dan temen ane dpet index 2, nah disitu bagaimana biar server nngebagi pesannya trus dikirim ke orang yang dituju hanya ke index 2, mohon bantuannya om,,, udah buntu bangr neh,,,, hehehe
Jadi misalkan ada tabel khusus dg nama klien_aktif yg menyimpan informasi index winsock dan ip addressnya, jadi pass kita ngirim perintah :
Di server tinggal query
Nah setelah dapat indexnya kan tinggal kirim balik dari server :
ow berrti ane harus bikin database di my sql dlu dnk om,, cz database yang ane pake di server akses om,,,,
Ya enggak masalah om
oke,,, ane coba dulu om,,,, makaseh banget ya,,,,, masih amatir ne om,,,, hehe
Oke om sama2x
om codingnya biar data(ip and index) klient yang masuk langsug otomatis kesimpan di database gmana ya, trus query buat di microsoft akses gmana ? maaf om banyak nanya,,,
om sudah saya coba,,,, tapi datanya ga terkirim ke orang yang dituju om,,,, kira2 salah apanya ya,,,,,,
Coba copas ke sini om kode untuk menyimpan ip dan index plus kode waktu ngirimnya
om,saya mau tanya…kalo mau ngirim data (misal 8 bit) dari kartu komputer IC PPI 8255 dari satu PC ke PC yang laen lewat jaringan LAN (Komunikasinya paralel,Tp bukan lewat DB25 melainkan Slot ISA kartu komputer IC PPI 8255nya) caranya gmn ya pada winsocknya???? *kan kalo serial (DB9 ) dideklarasikan pake
MS.comm.CommPort=…
MS.comm.settings= “2400,N,8,1″
MS.comm.InputLen=…
MS.comm.PortOpen=….
MS.comm.Output=…
nah kalo lewat Slot Isa gmn??mohon dibantu ke email saya surya_elektro06@yahoo.co.id..
terima kasih banyak..
Sory om sy sendiri agak asing dg beberapa istilah yg om sebutkan
, harap maklum sy bukan anak elektro atw teknik jadi belum bisa bantu
om udah bisa om,,,, thnks banget ya,,, atas petunjuknya….. sukses terus deh buat codding 4ever,,,,
Oke sama2x om
Mas ADMIN, salam kenall…
Kebetulan saya lagi ngerjain skripsi, kmrin saya bkin pet emulator tapi masih versi offline.. Sekarang mau dijadikan online jadi antar pet bisa saling battle dan berantem tapi saya sendiri masi bingung2 soal VPN server.. Padahal simple aja tukeran data antar Pet trus battle.. Bingung nyediain servernya lewat internet.. Ini saya masi pelajari winsock nya..
Mau saya coba tes client server, tapi krna 1 pc gmna dijalankan ya? Kan biar jelas harus beda IP antara client dan servernya..
Saya butuh byk bantuan mas nih, hehee.. ^^
Salam kenal juga om
Iya, om bisa coba 1 pc dulu aja trus biar bisa jalan 2 sistem operasi om bisa coba VirtualBox.
Sy sendiri juga menggunakan VirtualBox untuk ngetes program sebelum diluncurkan ke klien2x.
Kmrin saya donload Virtual PC kk admin, tapi pas ngecek IP nya sama pula..
Nanti saya coba Virtual Box de.. Kk admin jgn kemana-mana.. Sering2 ol ajarin saya. Oke?
Kk masalah IP nya uda bisa.. Nah sekarang biar game saya bisa trkoneksi antar player 1 sama lain.. Saya pengen ceritakan konsepnya secara rinci.. Kk admin ada waktu tidak? Maaf saya beneran newbie soal jaringan bgini.. Hehee..
Ceritanya disini aja om enggak pa2x kok, soalnya sy jarang OL
Kalo pke hamachi repot juga ya, perlu nyeting di network connectionnya kk admin..
Makanya mendingan fokus dulu uji cobanya menggunakan Virtual PC atw Virtual Box sama aja biar lebih gampang testing dan developnya.
Klo besok2x mau diimplementasikan di jaringan lokal atw intenet sy rasa enggak ada masalah dg programnya toh itu hanya masalah koneksi saja.
Hehee.. Sudah bisa kk admin.. Uda jalan secara jaringan cuma ini kan lewat virtual PC..
Cuma saya di dalam virtual PC pas battle na kayak agak macet gtu.. Krna dy mulai bersamaan.. Yang di virtual PCnya agak lelet, mgkin pembagian RAM..
Maaf kk saya mau tnya lagi, ini gw pke IP na 192.168.1.2 9 (asli) ama 192.168.1.3 (virtual)..
Blm coba pke IP publik.. Atau saya perlu pke IP dari hamachi kk? Jadi saya share ke pengguna hamachi yg laen dan tes pke IP dari sana.. dan portnya itu acak gpp kan?
Atw coba dulu om 2 pc pake kabel cross untuk masalah port kan tergantung aplikasi om menghandlenya gimana
Umm kalo di app saya portnya isi manuall.. Jadi di PC1 ama PC2 harus masukin port yg sama.. Saya pengennya para user gak perlu repot sama isian port.. Jadi otomatis.. cukup masukin ip lawan.. Trus mulai deh. Sipp aq cari2 dlu..
Ya tetap harus ada default port om, sama seperti database MySQL yg menggunakan default port 3306, SQL Server port 1433, radmin port 4899, HTTP port 80 de el el.
Tapi tentunya disediain juga fasilitas untuk merubahnya.
Oke kk saya ngerti sekarang hehehee.. Siappp!!! THanks banyakk kk buat tutor2 nya juga.. hehe
Sama2x om
om kalo mau kirim data bukan tekt,,tp berupa string atau integer deklarasi dimensionnya gmana ya pada bagian event dataarrivalnya??(pada bagian program servernya)?
Klo ini kayaxnya enggak masalah om, dicoba dulu aja
mas boleh nanya coding gak?…
gimana kalo pemilihan pc di server berdasarkan penulisan di textbox?
kan mas buat yg diserver list1 harus dipilih…gimana kalo pilihannya diketik di textbox mis :”PC 01″ gitu…
Sama aja kan om, toh cuma ngampil nilai dari properties textnya
Heloo kk admin, ada dapat SMTP server yang gratis gak? SMTP yang “smtp.telkom.net” uda gak jalan..
Kalau ada sekalian portnya ya.. Thanks
Wah jujur aja nih sy belum pernah main2x SMTP server om
Ohh iya tapi koq saya di panggil om, masi 20tahun, hahaha..
Makasi yah kk admin..
Sama om sy juga 20 thnan tapi… beberapa tahun yg lalu
artikel keren dan sangat membantu, ini contoh aplikasi dari ilmu yang dibagikan disini. semoga allah merahmati kebaikan antum, salam.
Sama2x akh, klo liat sekilas aplikasinya kren nih.
Kok enggak lansung share link aja
Mas Admin.. waktu di dataarrival saat getdata saya ketemu error berikut ini. ini kira2 masalahnya di mana mas? tks sebelumnya
Run-time error ’40006′
Wrong protocol or connection state for the requested transaction or request
mas satu lagi …
cara mengetahui respon di dataarrival telah selesai gimana codenya ya, solanya kirimannya/responya lebih dari satu kiriman/packet. Tks …
Coba postingan sy yg ini om, disitu ada contoh memotong packet yg panjang dikirim beberapa kali.
Pagi Om, saya mau tanya. Bagaimana coding VB6 nya untuk bisa melihat jaringan yang ada di beberapa tempat yang berjalan dengan baik dan untuk koneksinya antar tempatnya pakai ip publik dari logmein hamchi. Contohnya, Misalkan saya ada di tempat A dan saya pengen tau jaringan di tempat B itu berjalan dengan baik tanpa ada RTO nya, tanpa saya harus remote ke tempat B. Saya coba kembangkan dari CekIPAktive dan Winsok5 nya punya Om, tapi masih belum berhasil. Mohon Pencerahannya Om, terima kasih…
Klo diping biasa bisa enggak om ?
klo ping manual, bisa OM.. Cuman saya bingung koneksi ke hamchi nya terus baru masuk ke server lokasi B nya. itu yang saya masih bingung codingnya… Mohon bantuan nya Om…
Jadi intinya cuma pengen ngePING tapi dari VB iya enggak ? Klo iya coba pake module PING, trus tinggal panggil seperti berikut :
Private Sub cmdTesPing_Click() Dim ECHO As ICMP_ECHO_REPLY Call Ping("192.168.1.2", ECHO) If ECHO.status = 0 Then 'koneksi ke server sukses Debug.Print "Koneksi oke" Else Debug.Print "RTO" End If End Submas maaf mau tanya, sy lg coba-coba bkin sistem antrian berbasis client server yg multi client, tp sy msih bingung mslh di codingnya, jd pas di client di klik tombol antrian itu akan mengecek no antrian yg terakhir yg ada di server lalu akan menembahkan no_antrian+1 di servernya dan otomatis mengirimkan lg ke client tersebut nomor antriannya..
Mohon pencerahannya, maaf masih newbie..
Postingan sy diatas udah dicoba belum om ??? Klo enggak ya pasti bingung ???
Padahal sy sudah pernah menulis artikel lengkap tentang winsock mulai dari artikel satu, dua, tiga dan empat
.
Klo om sudah mempelajari postingan sy diatas secara serius jangankan cuma aplikasi antrian om, aplikasi billing warnet juga bakalan bisa om buat
.
Buktinya ada yg berhasil menerapkan sample diatas untuk membuat aplikasi antrian
Kita sebagai seorang programmer sebenarnya cukup membutuhkan 1 titik cahaya, sisanya kita akan cari sendiri.
Tinggal duduk manis di depan komputer buka search engine, ketik keyword maka semua informasi akan menjadi milik kita, nah yg menjadi pertanyaannya adalah maukah kita bersabar untuk mengklik satu persatu link yg ada dan mencoba kode2x yg ada didalamnya ???
Nah semangat ini yg jarang sy lihat pada orang2x yg katanya masih newbie, pengennya yg instan2x saja.
Jadi jangan lihat skrg si A kok jago banget ya programmingnya, tapi lihat duluuuu si A itu belajarnya gimana.
ms..mau nny, kl multiple connection menggunakan winsock di game penerapanny gmn y ms?..ms d g referensiny terutama di gameny?,kl blh mo mnta,he soalny lg ngerjin TA ttg game jaringan buat tambahan referensi,mksh
Coba disini.
mas itu kan pake vb6 gw pengen pake vb.net nah gw bingung di indexnya. itu create indexnya dimana y?
Klo di VB .NET sudah ada class tersendiri om, klo untuk samplenya bisa dicek disini.
ko jadi command prompt gitu y?
gw coba dulu deh
misalkan kita pake code di atas tapi kita bikin index sendiri apa itu memungkinkan?