Anda di halaman 1dari 4

Socket Programming Dengan PHP

Author : KillFinger On 07 May 2006 Jam 03:33

MENGENAL SOCKET PROGRAMMING DENGAN PHP

oleh Kill Finger

Terbitan ONLINE INDOHACK


#############################################################

"Socket programming dengan PHP?? Masa bisa sih??"

Itulah pertanyaan yang pernah dilontarkan oleh seseorang di IRC sekitar tahun 2002-
an. Waktu itu saya juga bertanya-tanya, mungkin gak ya?. Setelah buka-buka artikel
dari master2 PHP, akhirnya saya harus berterima kasih kepada Daniel Solin. ya,
karena PHP sendiri tidak menerangkan tentang basic understanding tentang apa yang
dimaksud dengan socket, bagaimana membuat code PHP sehingga 2 komputer itu bisa
berkomunikasi, dll. Makanya pengertian PHP socket itu saya dapat dari Daniel Solin.

Ok, langsung fokus aja, kamu pasti tau apa itu network 'kan? socket? hmmm....nggak
juga?! Gini, socket itu adalah salah satu low-level feature abstrack yang dimiliki
oleh operating system. Cukup segitu aja karena kita tidak perlu mengetahui lebih
jauh kalau hanya ingin menggunakan socket di program kita. Yang kita butuhkan hanya
philosophy dasar dari cara kerja socket.

Network socket dalam PHP tidak/belum dilengkapi dengan 'most advanced feature'
sebagaimana yang dimiliki oleh C, tapi 95% dari network application bisa digarap
disini. Not bad 'kan?. Karenanya kamu bisa membuat real network application
menggunakan 'easy-to-use language', PHP. Perhatikan contoh code listing1.php
(Bagian bawah artikel ini).

Perhatikan baris ke-8, penggunaan set_time_limit(0) agar PHP mengetahui kalau kita
menginginkan koneksi pada waktu yang tak terbatas.

Pada baris ke-11 hingga ke-15, kita membuat socket baru. Hal ini dikenal dengan
global socket yang akan menjadi check pamareter atas semua koneksi yang masuk.
Untuk itu kita menggunakan fungsi socket() yang menggunakan 3 argument. Karena
artikel ini tidak membahas tentang network proggie, maka ke-3 argument tsb tidak
dibahas disini. Kalau level kamu sudah intermediate/advance kamu bisa menggunakan
argument2 lain daripada yang digunakan pada contoh listing1 (artinya kamu udah
mampu membuat network programming). Contoh yang cukup menarik pada listing1
terlihat di argument yang kedua, SOCK_STREAM mendeklarasikan TCP sebagai protocol
dari socket (tidak dengan UDP).

Pada baris ke-18 hingga 22, socket yang baru terbentuk di bound ke IP address dan
port tertentu. Selama kamu menginginkannya untuk jalan di local machine, maka nomer
IP nya 127.0.0.1. Port yang digunakan adalah 10000, diambil secara random. Kamu
bisa menggunakan port tertentu antara 1024-65535 yang tidak terpakai.

Baris ke-28 hingga 31 menerangkan kalau processnya kembali ke posisi listen.


Sedangkan pada baris ke 34 hingga 38 process akan menunggu koneksi yang masuk.
Dalam istilah pemrograman, fungsi accept_connect() akan menunggu hingga koneksi itu
datang sendiri. So, program pada listing1 akan berhenti beroperasi pada tahap ini
hingga kita melakukan telnet/remote koneksi ke mesin tsb. Perlu diperhatikan,
accept_connect() akan membuat socket lain ketika koneksi yang baru telah diterima,
biasanya disebut dgn $msgsock, yang akan menangani bagian perkoneksian.
Pada baris ke-41 hingga 46 kita membuat welcome message yang akan diterima oleh
visitor dengan menggunakan fungsi write(). Ingat, process ini dilakukan oleh
$msgsock dan bukan oleh $sock. Pada tingkat ini, fungsi aceept_connect() telah
mendeteksi adanya koneksi. Bisa disimpulkan disini scriptnya telah berajalan baik.

Pada baris ke-49 hingga 54, terlihat sesuatu yang menarik. Disini $msgsock yang
mengambil alih untuk memastikan $sock bisa masuk/diterima. Dalam istilah
pemrograman, penggunaa read() adalah untuk membaca data dari koneksi kita. Supaya
kita bisa menerima data, data tsb harus dikirim terlebih dahulu dari pihak lain.
Seperti halnya accept_connect(), perintah read() akan menunggu hingga sesuatu
terjadi. Ketika data telah diterima di port 10000, $msgsock, akan mengambil data
tsb dan menampilkannya melalui variable $buf. Sekarang kita telah menerima tampilan
data melalui $buf dan dapat mengirimkannya kembali pada baris ke-57 hingga 61.
Disini, sekali lagi $msgsock akan mengambil alih, dan $sock akan tetap terbuka.

Hal terakhir pada script ini yaitu pada baris ke-64 hingga 67 PHP menutup socket
dan menutup koneksi network.

MENGUJI TCP SERVER KITA

Setelah mempelajari dari source code listing1 maka kini saatnya untuk pengetesan.
Jangan lupa untuk merename source tersebut menjadi listing1.php. Seperti biasanya,
supaya kita bisa menjalankan suatu program maka kita harus terlebih dahulu mengatur
permissionnya:

chmod 755 listing1.php

Dan pastikan juga baris pertama source code listing1.php mengacu ke path PHP binary
system kamu. Lalu tinggal dijalankan:

./listing1.php

Kalau terjadi error socket() function is undefined, maka kamu harus mengedit PHP
binary kamu dengan menjalankan ./configure --enable-sockets, recompile dan
reinstall PHP binary kamu dengan command make && make install.

Nah, setelah tidak ada error lagi langsung aja jalankan telnet ke server kamu
(dalam bahasan ini adalah localhost):

$telnet localhost 10000

Perintah diatas menunjukkan kalau kita ingin melakukan koneksi ke server localhost
melalui port 10000 yang telah di tentukan di source code listing1.php. (Nama server
dan port disesuaikan dengan kode kamu). Apabila semuanya lancar, maka akan tampak
seperti berikut:

$Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
Welcome to my TCP server!

Wow....sudah masuk tuh...


Coba deh buat sesuatu yang berguna di server tsb. Sebagai contoh, saya mengetikkan:

Hello
You said: Hello
Connection closed by foreign host.
Gimana? kool? walaupun sederhana, namun kita telah membuat suatu network connection
yang real dan dapat melakukan interkoneksi data melalui socket.

Sekarang kebayang gak kalo socket itu dijadikan backd00r? Gimana caranya?
Hehehe.....Udah ah segitu aja. Lagian kan temanya bukan pembuatan backd00r.

*NOTE: PHP adalah interpreter language yang syntaxnya hampir sama dengan C
language. Kalau kamu sudah familier dengan salah satunya maka kemungkinan kamu
tidak akan kesulitan dalam menggunakan keduanya. ;>

Semoga berguna untuk meningkatkan pengetahuan Proggie PHP kita. Salam buat A_BlAcK-
LisT, Acetosal, jhon angga, dan ryan_the. Special buat teman2 yang tidak bisa
disebutkan satu persatu di #SecretColony, #HackingCentre, #DoD, #Level9-Team @t
DAL.Net. Salam hangat buat #IndoHack crew.

Maap kalau bahasannya udah gak fresh lagi. Just wanna share and be shared.

Best Regs,

KillFinger

Credit to Daniel Solin ,a freelance writer and Linux consultant whose specialty is
GUI programming. "Introduction to Socket Programming with PHP", his helpfull
article.

Source Code Listing1.php

1 #!/usr/local/bin/php -q
2
3 4 /*
5 * We don't want any time-limit for how the long can hang
6 * around, waiting for connections:
7 */
8 set_time_limit(0);
9
10 /* Create a new socket: */
11 if( ($sock = socket( AF_INET, SOCK_STREAM, 0 )) < 0 )
12 {
13 print strerror( $sock ) . "\n";
14 exit(1);
15 }
16
17 /* Bind the socket to an address and a port: */
18 if( ($ret = bind( $sock, "127.0.0.1", 10000 )) < 0 )
19 {
20 print strerror( $ret ) . "\n";
21 exit(1);
22 }
23
24 /*
25 * Listen for incoming connections on $sock.
26 * The '5' means that we allow 5 queued connections.
27 */
28 if( ($ret = listen( $sock, 5 )) < 0 )
29 {
30 print strerror( $ret ) . "\n";
31 }
32
33 /* Accept incoming connections: */
34 if( ($msgsock = accept_connect( $sock )) < 0)
35 {
36 print strerror( $msgsock ) . "\n";
37 exit(1);
38 }
39
40 /* Send the welcome-message: */
41 $message = "Welcome to my TCP-server!\n";
42 if( ($ret = write( $msgsock, $message, strlen($message)) ) < 0 )
43 {
44 print strerror( $msgsock ) . "\n";
45 exit(1);
46 }
47
48 /* Read/Receive some data from the client: */
49 $buf = '';
50 if( ($ret = read( $msgsock, $buf, 128 )) < 0 )
51 {
52 print strerror( $ret ) . "\n";
53 exit(1);
54 }
55
56 /* Echo the received data back to the client: */
57 if( ($ret = write( $msgsock, "You said: $buf\0\n", strlen("You said:
$buf\0\n")) ) < 0 )
58 {
59 print strerror( $ret ) . "\n";
60 exit(1);
61 }
62
63 /* Close the communication-socket: */
64 close( $msgsock );
65
66 /* Close the global socket: */
67 close( $sock );
68 ?>
--

Anda mungkin juga menyukai