• Tidak ada hasil yang ditemukan

Implementasi socket pada aplikasi

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

Seperti halnya pada sisi server, proses ini juga akan menerjemahkan paket data yang

diterima menjadi perintah yang akan dilakukan oleh client. Setelah paket data

diterjemahkan, maka client juga akan mengirimkan paket data kepada server

berdasarkan perintah terjemahan tersebut, seperti meminta authentifikasi, meminta

data stream, atau pemberitahuan bahwa authentifikasi gagal.

Dokumen terkait