BAB I PENDAHULUAN
4.4. Implementasi socket pada aplikasi
Secara umum socket pada masing-masing aplikasi memiliki fungsionalitas
yang sama, akan tetapi secara proses masing-masing aplikasi memiliki alur yang
berbeda. Pada sisi server, socket akan bersifat multiple sehingga sisi server mampu
untuk menerima multiple connection dari beberapa host. Fungsi seperti ini dilakukan
dengan cara menyiapkan satu socket untuk selalu listening pada port yang sudah
didefinisikan sebelumnya, lalu disediakan juga socket lain yang akan berkomunikasi
secara langsung dengan client yang melakukan request connect ke server. Sedang
pada sisi client, masing-masing socket akan dialokasikan hanya untuk satu connection
ke server, meskipun secara tampilan sisi client memiliki banyak target host, namun
untuk setiap host tersebut hanya terdapat satu socket.
Berikut ini merupakan proses pada sisi server untuk menangani event
requestconnect.
Privat e Sub inSock_ConnectionRequest (ByVal requestID As Long) ' have a free sock connect t o the request
Dim i As Integer
If INIGet (" int egration" , " ipfilter" , FilePat hINI) Then
GoTo hell End If End If For i = 0 To 10 If FreeConn(i) Then FreeConn(i) = False out Sock(i).Close
out Sock(i).Accept requestID
'M sgBox "Port ing Connect ion t o index " & i Exit For End If Next hell: inSock.Close End Sub
Pada proses ini, socket sisi server akan melemparkan requestID dari connection
request sisi client kepada socket lain pada sisi server yang sedang menganggur atau
free lalu membuat socket tersebut yang akan berkomunikasi dengan sisi client. Proses
penerimaan requestID tersebutlah yang akan dilakukan secara terus menerus selama
terjadi requestconnect dari sisi client.
Ketika konektivitas sudah terjalin maka antara client dengan server dapat
memulai untuk mengirimkan data. Untuk dapat saling berkomunikasi dengan baik,
dibuatlah sebuah protokol lain selain TCP/IP yang akan berfungsi untuk
membahasakan isi dari paket data yang dikirimkan. Seperti halnya protokol YM
(Yahoo! Messenger), protokol ini penyusun beri nama protokol ITP (invisible_theater
protokol) Berikut ini merupakan protokol ITP yang dirangkum dalam satu module
Visual Basic:
Opt ion Explicit
'* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ' Aut hor: invisible_t heat er (invisible_t heat er@yahoo.com) '
' (invisible.t heat er@gmail.com) ' ' '
' Dat e: 07/ 02/ 2007. '
' Copyright : Copyright © 2007, invisible_t heater. ' ' Purpose: webcamera syncronizat ion and comunication as ' ' internet prot ocol. '
' ' ' Det ails: '
' ITP module (invisible_t heat er Prot ocol) ' ' '
' NOTE: ' ' ' ' '
'* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ' =================== CONSTANT PACKET PROTOCOL ======================== '
'Private Const START_WEBCAM = " #i_t #st art #i_t #" 'Private Const STOP_WEBCAM = " #i_t #st op#i_t #" 'Private Const OPEN_CONN = " #i_t #open#i_t#" 'Private Const CLOSE_CONN = " #i_t #close#i_t #" 'Private Const REJECT_CONN = " #i_t #reject #i_t #" 'Private Const ACCEPT_CONN = "#i_t#accept #i_t #" 'Private Const KEEP_ALIVE = " #i_t #pingpong#i_t #" Privat e Const PACKET_COM M AND = " #i_t #" Privat e Const PACKET_AUTH = " #invisible#" Privat e Const PACKET_DATA = "#dat #"
' ===================================================================== ' Dim Crypt o As New clsCrypt oRC4
Public Funct ion get Frame(ByVal Frame As St ring) As String
If Left(Frame, 5) = PACKET_COM M AND And Right(Frame, 5) = PACKET_COM M AND Then get Frame = get Command(Frame)
ElseIf Left (Frame, 11) = PACKET_AUTH And Right (Frame, 11) = PACKET_AUTH Then get Frame = " aut h" 'get Aut h(frame)
ElseIf Left (Frame, 5) = PACKET_DATA Then get Frame = " dat a" 'get Dat a(frame) Else: get Frame = " NOT DEFINED COM M AND" End If
End Funct ion
Privat e Funct ion get Command(ByVal dat a As St ring) As String 'get Command = St rReverse(M id$(StrReverse(M id(dat a, 6)), 6)) Dim arrDATA As Variant
get Comm and = arrDATA(1)
Debug.Print "get Command :: " & arrDATA(1) End Funct ion
Public Funct ion get Aut h(ByVal dat a As String) As St ring Dim RAW_CRYPTED As St ring, CRYPTED As St ring
'RAW_CRYPTED = St rReverse(M id(St rReverse(M id(data, 12)), 12)) Dim arrDATA As Variant
arrDATA = Split(dat a, PACKET_AUTH) ' RAW_CRYPTED = arrDATA(1)
Debug.Print "raw crypt ed :: " & arrDATA(1)
CRYPTED = Crypt o.ACSDecrypt(RAW_CRYPTED, FormM ain.PASS_CODE, True) Debug.Print CRYPTED
CRYPTED = M id$(CRYPTED, 6, Len(CRYPTED) - 10) Debug.Print " AUTH :: " & CRYPTED
get Aut h = CRYPTED End Funct ion
Public Funct ion get Dat a(ByVal dat a As St ring) As String Dim i As Long
Dim arrDATA As Variant
arrDATA = Split(dat a, PACKET_DATA, -1, vbText Compare) ' 'get Dat a = arrDATA(0)
For i = 0 To UBound(arrDATA) getDat a = get Dat a & arrDATA(i) Next
Debug.Print "DATA : " & dat a End Funct ion
Public Funct ion set Frame(ByVal Command As St ring, Opt ional password As St ring, Opt ional dat a As St ring) As String
'Dim dat aPacket As String Select Case LCase(Command) Case " aut h"
set Fram e = PACKET_AUTH & Crypt o.ACSEncrypt (" aut h!" & password & "!aut h" , password, True) & PACKET_AUTH
Case " dat a"
set Frame = dat a & PACKET_DATA Case " st art"
set Frame = PACKET_COM M AND & LCase(Command) & PACKET_COM M AND Case " st op"
set Frame = PACKET_COM M AND & LCase(Command) & PACKET_COM M AND Case " open"
set Frame = PACKET_COM M AND & LCase(Command) & PACKET_COM M AND Case " close"
set Frame = PACKET_COM M AND & LCase(Command) & PACKET_COM M AND Case " get aut h"
set Frame = PACKET_COM M AND & LCase(Command) & PACKET_COM M AND Case " okaut h"
set Frame = PACKET_COM M AND & LCase(Command) & PACKET_COM M AND Case " errauth"
set Frame = PACKET_COM M AND & LCase(Command) & PACKET_COM M AND Case " errst art "
set Frame = PACKET_COM M AND & LCase(Command) & PACKET_COM M AND Case " next"
set Frame = PACKET_COM M AND & LCase(Command) & PACKET_COM M AND Case " "
set Frame = PACKET_COM M AND & " " & PACKET_COM M AND End Select
End Funct ion
Protokol tersebut akan membungkus paket-paket data komunikasi yang kritikal
menjadi paket data yang terenkripsi, seperti paket data autentifikasi password. Selain
itu, modul tersebut memiliki fungsi-fungsi yang berguna untuk menterjemahkan dari
paket data mentah menjadi paket data yang siap dikirimkan melalui jaringan dan
sebaliknya.
Dalam mengirimkan stream paket-paket datanya baik aplikasi server
maupun aplikasi client harus selalu melakukan sinkronisasi mengenai paket data yang
telah diterima dan yang akan dikirimkan. Sinkronisasi tersebut berguna untuk
memastikan apakah paket data tersebut rusak atau tidak, selain itu berguna untuk
memastikan akhir dari sebuah stream paket data. Sinkronisasi tersebut berupa
acknowledgment yang telah disepakati antar client dan server.
Proses yang akan terjadi pada sisi server ketika menerima data dari client :
Privat e Sub out Sock_Dat aArrival(Index As Int eger, ByVal bytesTot al As Long) If isReadyToCommunicat e(out Sock(Index)) Then
Dim dat a As String
out Sock(Index).get Dat a dat a
' / / add packet received t o list box 'listPacketDat a.AddIt em dat a
'If list Packet Dat a.List Count > 0 Then list Packet Dat a.Select ed(list Packet Dat a.List Count - 1) = True 'M sgBox dat a
Select Case get Frame(dat a)
Case " aut h" ' server received
'w rit eLogDat aIn (" REQUEST LOGIN ATTEM PT FROM [ " & inSock.Remot eHost IP & " :" & inSock.Remot ePort & " ]")
'M sgBox " REQUEST LOGIN ATTEM PT FROM [ " & inSock.Remot eHost IP & " :" & inSock.Remot ePort & " ]"
If get Auth(dat a) = PASS_CODE Then ISAUTHENTICATED(Index) = True
'w rit eLogDat aIn (" ACCESS CODE ACCEPTED. [aut hent ification valid. w aiting for next command.]")
out Sock(Index).SendDat a (set Frame(" okauth" )) Else
ISAUTHENTICATED(Index) = False
'w rit eLogDat aIn (" WRONG ACCESS CODE. [aut hent ificat ion failure, closing connection t o
remot ehost.]")
out Sock(Index).SendDat a (set Frame(" erraut h" )) DoEvent s
'reset socket t o cont rol out Sock(Index).Close closeSession (Index) '
End If
Case " st art " ' server received
'lblSt at us.Caption = " at tempt ed t o st art camera"
'w rit eLogDat aIn (" REQUEST START CAM ERA ATTEM PT FROM [ " & inSock.Remot eHost IP & " :" & inSock.Remot ePort & " ]")
'st art Capture
'M sgBox " REQUEST START CAM ERA ATTEM PT FROM [ " & inSock.RemoteHost IP & " :" & inSock.Remot ePort & " ]"
If ISAUTHENTICATED(Index) Then
lblpackage.Caption = " START BROADCASTING ..." 'Call st art Cam(framePreview .hw nd)
'ISCAM HASSTART = True
tmrSender(Index).Interval = SPEEDCAPTURE tmrSender(Index).Enabled = True
Else
out Sock(Index).SendDat a (set Frame(" get aut h"))
'w rit eLogDat aIn ("REQUEST NOT AUTHORIZED. [request cam not aut horized, requesting aut horizat ion code from remot ehost.]" )
End If
'lblSt at us.Caption = " at tempt ed t o st op camera"
'w rit eLogDat aIn (" REQUEST STOP CAM ERA FROM [ " & inSock.Remot eHostIP & " :" & inSock.Remot ePort & " ]")
'ISCAM HASSTART = False
'M sgBox " REQUEST STOP CAM ERA FROM [ " & inSock.Remot eHost IP & " :" & inSock.Remot ePort & " ]"
If ISAUTHENTICATED(Index) Then 'Call st opCam
tmrSender(Index).Enabled = False closeSession (Index)
'ISCAM HASSTART = False
'writeLogDat aIn (" BRODCAST AND CAM ERA STOPPED ...")
Else: 'w riteLogDat aIn ("PROBABLY HIJACKING PROCEDURAL DETECTED") End If
Case " open" ' server received
'lblSt at us.Caption = " at tempt ed t o handshake"
'w rit eLogDat aIn (" REQUEST HANDSHAKE FROM [ " & inSock.RemoteHost IP & " :" & inSock.Remot ePort & " ]")
'M sgBox " REQUEST HANDSHAKE FROM [ " & inSock.Rem oteHost IP & " :" & inSock.Rem otePort & " ]"
If ISAUTHENTICATED(Index) Then
'writeLogDat aIn (" HOST ALREADY AUTHORIZED. [wait ing for next comm and.]" ) Else
out Sock(Index).SendDat a (set Frame(" get aut h"))
'w rit eLogDat aIn (" HOST NOT AUTHORIZED. [ requesting aut horizat ion code from remot e host.]" )
End If
Case "close" 'server received
'lblSt at us.Caption = " at tempt ed t o close connection"
'w rit eLogDat aIn (" CONNECTION CLOSING ATTEM PT FROM [ " & inSock.RemoteHost IP & " :" & inSock.Remot ePort & " ]")
'M sgBox " CONNECTION CLOSING ATTEM PT FROM [ " & inSock.Remot eHostIP & " :" & inSock.Remot ePort & " ]"
If ISAUTHENTICATED(Index) Then
'writeLogDat aIn (" CLOSE CONNECTION TO REM OTE HOST" ) 'ISCAM HASSTART = False
tmrSender(Index).Enabled = False closeSession (Index)
'Call st opCam 'st opConnect
Else: 'w riteLogDat aIn ("PROBABLY HIJACKING PROCEDURAL DETECTED") End If
Case " next "
NextPart(Index) = True
'lblSt at us.Caption = "[WARNING !!! ] hijacking at t empt."
'w rit eLogDat aIn ("M ALICIOUS CODE RECEIVED FROM [ " & inSock.RemoteHost IP & " :" & inSock.Remot ePort & " ]")
'w rit eLogDat aIn (" PROBABLY HIJACKING PROCEDURAL DETECTED")
'M sgBox " M ALICIOUS CODE RECEIVED FROM [ " & inSock.Remot eHost IP & " :" & inSock.Remot ePort & " ]"
End Select
Else End If End Sub
Sebelum mengirimkan paket stream, aplikasi server melakukan validasi terlebih
dahulu, apakah koneksi dengan client sudah terjalin atau belum. Ketika koneksi telah
terjalin maka setiap paket data yang diterima oleh server akan diterjemahkan
berdasarkan protokol yang telah didefinisikan.
Ketika hasil terjemahan tersebut berupa permintaan untuk mengirimkan paket stream
ke client, maka aplikasi server akan melakukan proses sebagai berikut:
Privat e Sub tmrSender_Timer(Index As Int eger) 'On Error GoTo hell
tmrSender(Index).Int erval = SPEEDCAPTURE
lbltimer.Capt ion = " Timer : " & Index & " [act ivat ed] PORT : " & out Sock(Index).Index If isCameraON <> True Then
M sgBox " Camera is Off" GoTo hell
Else
FileName = App.Path & " \st ream" & Index & " .buff"
'w rit eImage
'SavePict ure picPreview .Pict ure, FileName
Call SAVEJPEG(get Widt h(lw ndCap), getHeight (lw ndCap), FileName, JPEGQUALITY, picPreview ) 'send file buffer t o remot ehost and t hen load file buffer t o _
preview w indow after all buffer has been send If ISAUTHENTICATED(Index) Then
If sendFile(FileName, Index) Then
'imgView .Pict ure = LoadPict ure(FileName) End If
Else
closeSession (Index) End If
'checking for connection. if not connected t hen st op camera rout ine
If Not isReadyToCommunicat e(out Sock(Index)) Or Not Next Part(Index) Then tmrSender(Index).Enabled = False
closeSession (Index) End If
'delet e file buffer
'If Dir(FileName) <> " " Then Kill FileName
End If hell: End Sub
Di mana server akan melakukan validasi mengenai konektivitas dan authentifikasi
terlebih dahulu, setelah melewati kedua validasi tersebut maka aplikasi server akan
mengirimkan paket data kepada aplikasi client pada socket yang bersangkutan.
Proses pada aplikasi client ketika menerima paket data dari server :
Privat e Sub out Sock_Dat aArrival(ByVal byt esTot al As Long) If isReadyToCommunicat e(out Sock) Then
Dim packet Dat a As St ring ', filename As String 'packetDat a = " "
out Sock.getDat a packetDat a
'lblSt atus.Capt ion = "received dat a : " & get Frame(packet Dat a) 'M sgBox packet Dat a
Debug.Print " RECEIVED PACKET :: " & packetDat a
Select Case get Frame(packetDat a) Case " dat a" ' client received
bufferName = App.Path & " \st ream" & M e.Caption & ".buff" If (saveFile(bufferName, getDat a(packet Data), M e)) Then On Error Resume Next
Wit h imgView
.Pict ure = LoadPict ure(bufferName) .ScaleM ode = 3
.AutoRedraw = True .PaintPict ure .Pict ure, _
0, 0, .ScaleWidth, .ScaleHeight , _ 0, 0, _
.Pict ure.Widt h / 26.46, _ .Pict ure.Height / 26.46 End Wit h Else End If
Case " get aut h" ' client received
lblSt at us.Capt ion = " at t empt ed t o get aut hent ification" Dim Pass As New FormPassBox
Pass.Show vbM odal, M DImain PASS_CODE = Pass.psw d
If isReadyToCommunicat e(out Sock) Then
out Sock.SendDat a (set Frame(" aut h" , PASS_CODE)) End If
Case " okaut h" ' client received
lblSt at us.Capt ion = "passw ord is OK" out Sock.SendDat a (set Frame(" st art " )) cmdConnect.Capt ion = " St op View ing"
Case " erraut h" ' client received
lblSt at us.Capt ion = "passw ord is incorrect " cmdConnect.Capt ion = " Connect "
st opConnect
Case " errst art" ' client received lblSt at us.Capt ion = " cam in use" st opConnect
Case " "
lblSt at us.Capt ion = " NOT DEFINED COM M AND" 'writeLogDat aIn (Part File & " BLANK : " & packetData)
Case " NOT DEFINED COM M AND"
lblSt at us.Capt ion = " [WARNING !!!] hijacking at t empt ." 'writeLogDat aIn (Part File & " NOT DEFINED: " & packet Dat a) End Select Else: End If hell: End Sub