Sabtu, 11 Juni 2011

Socket Programming di PHP

Ehm, ketemu kita, oke, hari ini gua bakal ngasih tau tentang Socket Programming yang ada di PHP, kaget? ini PHP-CLI, bukan PHP yang biasa di website-website itu (PHP yang jalan di webserver). Jadi PHP macem ini jalan dalam bentuk CLI (diliatin dari terminal, command prompt, dll.). Oke, itu fast introduction buat PHP-CLI aja, jadi langsung aja kita ke materi utama kita, okeh? then let's go... :P gue harap sih semuanya udah belajar PHP yah, jadi bisa lebh ngerti lah... malah wajib, kalo gak, kemungkinan gak bisa ngikutin penjelasannya, ya bisa karena bingung...

Udah download phpnya? cari di google yah cara installnya, di linux / di windows pun bisa, tapi kali ini gua bahas tentang linux aja deh... ehehehehe... sebenernya sih mirip-mirip lah...

Untuk permulaan, kita bikin dulu scriptnya:

#!/usr/bin/php -q
<?php
set_time_limit(0);
$host = "127.0.0.1";
$port = 31337;
$s = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");
$p = socket_bind($s, $host, $port) or die("Could not bind to socket\n");
$p = socket_listen($s, 3) or die("Could not set up socket listener\n");
$spwn = socket_accept($s) or die("Could not accept incoming connection\n");
$out = "
WELCOME TO ne0 d4rk fl00d3r's Darkness World
I hope you can Enjoy this :D
\n";
socket_write($spwn, $out, strlen($out)) or die("Could not write output\n");
socket_close($spwn);
socket_close($s);
?>

penjelasan tiap line code-code kita:
#!/usr/bin/php -q = ini wajib, buat manggil program php-nya (ya setidaknya di linux lah, kalo di windows bisa beda)
<?php = ini gak usah ditanya dong? hehe...
set_time_limit(0); = biar gak ada time limit buat eksekusi suatu code
$host = "127.0.0.1"; = kita masukin variable $host
$port = 31337; = kita masukin variable $port
$s = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n"); = Membuat socket, dengan opsi-opsi yang ada, dan 'or die'-nya buat kalo misalnya gagal ntar ada pesan errornya... masukkan ke variable $s (sebagai resource, supaya dapat digunakan di sepanjang code ini)
$p = socket_bind($s, $host, $port) or die("Could not bind to socket\n"); = Sebelum bisa menunggu koneksi dari luar, kita harus bind portnya dulu... bind port socket $s itu... (dibuka dulu gituloh) masukkan ke variable $p
$p = socket_listen($s) or die("Could not set up socket listener\n"); = Kita akan 'mendengarkan' koneksi dari luar lewat socket $s. masukkan ke variable $p juga
$spwn = socket_accept($s) or die("Could not accept incoming connection\n"); = karena sedang 'melisten' maka code ini gak bisa dieksekusi sebelum ada koneksi (kan baris sebelumnya itu untuk nunggu koneksi dari luar) jadi jika sudah ada koneksi, baru baris ini dieksekusi, arti dari code ini untuk menerima koneksi dari socket $s, masukkan ke variable $spwn

$out = "
WELCOME TO ne0d4rkfl00d3r's Darkness World
I hope you can Enjoy this :D
\n";

Ini gua sengaja bikin kayak gini, karena kalo pindah baris pakek enter biasa aja, kaga perlu pakek '\n' arti dari code ini adalah memasukkan kata-kata ke variable $out

socket_write($spwn, $out, strlen($out)) or die("Could not write output\n"); = kata-kata yang kita masukin ke variable $out tadi kita tampilin di socketnya, jadi pas kita konek ke socket muncul tulisan...
socket_close($spwn); = nah, ini kita menutup koneksi orang yang sudah connect ke socket kita. (karena didalam resource $spwn itu menerima koneksi dari orang, sehingga arti dari code ini menutup koneksi dari luar)
socket_close($s); = nah, ini untuk menutup socket kita sendiri. (karena didalam resource $s itu socket kita sendiri, maka arti code ini untuk menutup socket kita...)
?> = gak usah ditanya kan... hehehe...

Screenshotnya jadinya begini deh:


Oke, kita lanjut lagi, sekarang kita bakal bikin biar yang melakukan koneksi ke socket kita bisa ngetik input, keren kan? wkwkwkwkwk....

Oke, langsung aja, hanya beberapa modifikasi kok, kita pakek code kita yang tadi udah dibikin, jadinya kayaknya gini:

#!/usr/bin/php -q
<?php
set_time_limit(0);
$host = "127.0.0.1";
$port = 31337;
$s = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");
$p = socket_bind($s, $host, $port) or die("Could not bind to socket\n");
$p = socket_listen($s) or die("Could not set up socket listener\n");
$spwn = socket_accept($s) or die("Could not accept incoming connection\n");
$out = "
WELCOME TO ne0 d4rk fl00d3r's Darkness World
I hope you can Enjoy this :D
\n";
socket_write($spwn, $out, strlen($out)) or die("Could not write output\n");
$out = "Masukkan nama anda: ";
socket_write($spwn, $out, strlen($out)) or die("Could not write output\n");
$read = socket_read($spwn, 1000);
$out = "
Halo agan ".$read."
\n";
socket_write($spwn, $out, strlen($out)) or die("Could not write output\n");
socket_close($spwn);
socket_close($s);
?>

Mumpung udah ngerti semua kan? jadi gua cuma perlu masukin penjelasan untuk 1 fungsi aja yah...
$read = socket_read($spwn, 1000); = jadi kita akan menyediakan tempat untuk yang melakukan koneksi ke socket kita bisa input sesuatu yang panjangnya hanya boleh 1000 karakter / byte (liat angka 1000 di fungsi itu kan? nah itu bisa kita ganti-ganti) dan yang diinput akan dimasukkan ke variable $read jadi kita bisa gunakan variable itu sebagai variable type string, seperti pada fungsi ini:

$out = "
Halo agan ".$read."
\n";
socket_write($spwn, $out, strlen($out)) or die("Could not write output\n");

jika kita isi nama dengan devilish_children misalnya, maka akan keluar "Halo agan devilish_children

Ini ada screenshot hasil code itu:


Nah... sekarang masalahnya kan kalo setiap kali 1 orang mau connect ke socket kita harus kita jalanin juga kan? trus kalo kita ngadepin setiap hari kita ada 1000 orang yang mau melakukan koneksi ke socket kita? (konyol juga sih kalo orang-orang mau-maunya connect ke socket kita cuma mo nulis nama trus selesai, tapi kalo kita mau bikin project yang ebih besar? such as honeypot maybe? ato webserver? bisa kan?) emang ente mau client nunggu cuma buat kita nyalain script buat bikin socket lagi? eheheh... kaga kan? nah, makanya kita bikin sedikit modifikasi di script kita supaya tetep bertahan hidup walaupun client 1 udah selesai...

Here is the code... w00t w00t:

#!/usr/bin/php -q
<?php
set_time_limit(0);
$host = "127.0.0.1";
$port = 31337;
$ulang = true;
$s = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");
$p = socket_bind($s, $host, $port) or die("Could not bind to socket\n");
while ($ulang = true)
{
$p = socket_listen($s) or die("Could not set up socket listener\n");
$spwn = socket_accept($s) or die("Could not accept incoming connection\n");
echo "Ada Koneksi!!\n";
$out = "
WELCOME TO ne0 d4rk fl00d3r's Darkness World
I hope you can Enjoy this :D
\n";
socket_write($spwn, $out, strlen($out)) or die("Could not write output\n");
$out = "Masukkan nama anda: ";
socket_write($spwn, $out, strlen($out)) or die("Could not write output\n");
$read = socket_read($spwn, 1000);
$out = "
Halo agan ".$read."
\n";
socket_write($spwn, $out, strlen($out)) or die("Could not write output\n");
socket_close($spwn);
}
socket_close($s);
?>

penjelasan kecil:
$ulang = true; = kita set supaya variable $ulang isinya true (ini tipenya boolean)
while ($ulang = true) = ini artinya selama $ulang itu nilainya true, maka code yang diantara tanda '{' dan '}' (tanpa tanda kutip pastinya) akan dijalankan berulang-ulang, dalam hal ini, karena variable $ulang nggak diapa-apain, maka script ini akan berjalan terus-menerus, sampai ahirnya diterminate oleh user sendiri.
Ohiya, tentang kenapa kita ulangnya dari socket_listen? soalnya kan biar ngasih tau ke socket supaya dia mendengarkan / menunggu koneksi dari orang lain. dan kenapa akhirnya pada socket_close($spwn)? soalnya kalo tanpa diakhiri socket_close($spwn), sang client gak bisa keluar otomatis.

Ini screenshotnye:


Okeh, kayaknya sampai sini dulu, ntar kalo ada lanjutannya pasti akan diposting kok...

Tengkyu en Happy Coding...

Credit Card :
zee eichel, jimmyromanticdevil, shadowsmaker, jurank_dankkal, aip_zenzaky, RusH, cassaprodigy, Andre_Corleone , hilmy_100, nesta, All Tecon-Crew members, Everyone, and you!

Tidak ada komentar:

Posting Komentar