Penggunaan fungsi CURLCODE pada PHP

#define PORT 27111 #define MAXLEN 255 #define SERV_ADDR “localhost” int main() { int sock; struct sockaddr_in serv_addr; struct hostent *h; int snd, rcv; char msg[MAXLEN]; socklen_t sa_size; h = gethostbyname (SERV_ADDR); sock = socket(PF_INET, SOCK_ DGRAM, 0);

Source code client Berikut ini adalah source code client rem_ calc, yang diberinama rem_calc_client.c: /* * rem_calc_client * (c) nop, GPL. */ #include <stdio.h> #include

serv_addr.sin_family = AF_ INET; serv_addr.sin_port = htons(PORT); serv_addr.sin_addr = *((struct in_addr *)h->h_addr); memset(&(serv_addr.sin_zero), ‘\0’, 8);

if (strcmp (command, “CALC”) == 0) { sprintf (msg, “python -c ‘print %s’”, param); f = popen (msg, “r”); fgets (result, MAXLEN, f); pclose (f); result[strlen(result)-1] = ‘\0’; sprintf (msg, “RESULT %s”, result); printf(“\t Response text [%s]\n”, msg); snd = sendto (sock, msg, strlen (msg), 0, (struct sockaddr *)&cli_addr, sizeof (struct sockaddr));

32

04/2007  INFOLINUX

Situs web cURL.

www.infolinux.web.id

UTAMA 0701187]

Contoh keluaran dari rem_calc_client: $ ./rem_calc_client >> CALC 4/2.2 RESULT 1.81818181818 >> CALC 12345 * 99999 RESULT 1234487655 >> CALC 123 ** 99 RESULT 795437446969572962215989474 4034879189686011256075963493213501 9790296271625618826772704693920663 3805377147975587971037697856066197 1827825193973775841387160514098882 4186540481500347090116631003194401 3830701187 >>

PUSTAKA YANG TERSEDIA (CLIENT)

Situs web ftplib.

while ( 1 ) { printf (“>> “); fgets (msg, MAXLEN-1, stdin); snd = sendto(sock, msg, strlen(msg), 0, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr));

 Bukalah x terminal lain dan jalankanlah aplikasi client:

sa_size = sizeof (struct sockaddr); rcv = recvfrom (sock, msg, MAXLEN-1, 0, (struct sockaddr *)&serv_addr, &sa_size); msg[rcv] = ‘\0’; printf (“%s\n”, msg);

Contoh keluaran dari rem_calc_server:

} close(sock); return 0; }

Untuk kompilasi, berikanlah perintah: $ gcc -o rem_calc_client rem_calc_ client.c

Menguji client dan server Untuk menguji client dan server, lakukanlah langkah-langkah berikut:  Bukalah satu x terminal dan jalankanlah aplikasi server: ./rem_calc_server

www.infolinux.web.id

./rem_calc_client

 Di sisi client, sebuah prompt >> akan ditampilkan. Kita bisa mengirimkan ekspresi matematika dan server akan menampilkan hasil perhitungan input kita.

$ ./rem_calc_server [Received packet from 127.0.0.1] CALC 4/2.2 Command is [CALC] Param is [4/2.2] Response text [RESULT 1.81818181818] [Received packet from 127.0.0.1] CALC 12345 * 99999 Command is [CALC] Param is [12345 * 99999] Response text [RESULT 1234487655] [Received packet from 127.0.0.1] CALC 123 ** 99 Command is [CALC] Param is [123 ** 99] Response text [RESULT 7954374469695729622159894744034879 189686011256075963493213501979029 627162561882677270469392066338053 7714797558797103769785606619718278 251939737758413871605140988824186 540481500347090116631003194401383

Dalam contoh sebelumnya, kita bisa melihat bahwa kita mencoba untuk membangun protokol sederhana, milik kita sendiri. Berbagai protokol yang ada jelas jauh lebih rumit daripada apa yang kita buat. Walau demikian, untuk berbagai protokol yang rumit sekalipun, selama spesifikasinya tersedia, kita bisa saja membaca dan menerapkan client sendiri. Namun, dengan spesifikasi puluhan halaman atau lebih, dengan segala kompleksitasnya, untuk berbicara dengan server saja, kita membutuhkan waktu yang relatif lama. Belum lagi masalah keamanan. Dan, ini tentu saja belum termasuk mengurusi fungsi utama aplikasi client. Untungnya, di dunia ini, terdapat cukup banyak pustaka, yang memungkinkan Anda untuk berbicara dengan banyak protokol tanpa harus repot-repot memahami detail protokol tersebut. Kita akan membahas beberapa di antaranya.

Libcurl Boleh dikatakan, ini adalah salah satu pustaka yang paling lengkap dan kaya fitur. Libcurl, yang bisa di-download di http://curl. haxx.se/, mendukung berbagai protokol berikut ini:  FTP/FTPS (termasuk FTP upload).  HTTP/HTTPS (POST, PUT, form upload, proxy, tunnel, dan lain-lain).  SCP/SFTP.  TFTP.  TELNET. INFOLINUX  04/2007

33

UTAMA ftplib ftplib merupakan pustaka yang mengimplementasikan protokol FTP. Pustaka ini mengizinkan aplikasi untuk mengakses serta membuat file remote dengan mudah. Ftplib mendukung platform-platform berikut:  Linux.  VMS.  DigitalUnix.  Windows NT. Pada saat tulisan ini dibuat, versi terbaru ftplib adalah 3.1-1, yang dirilis pada 16 September 2000.

Pustaka-pustaka lain Situs web libspopc.

 DICT.  FILE.  LDAP. Sebagai suatu pustaka, libcurl juga bahkan mendukung banyak platform berikut ini:  Solaris.  NetBSD.  FreeBSD.  OpenBSD.  Darwin.  HP UX.  IRIX.  AIX.  Tru64.  Linux.  UnixWare.  HURD.  Windows.  Amiga.  OS/2.  BeOS.  Mac OS X.  Ultrix.  QNX.  openVMS.  Novell Netware.  DOS.  Dan lain sebagainya. Selain mendukung banyak protokol dan sangat portable, libcurl juga mendukung SSL certificate dan berbagai fitur lainnya, seperti:

34

04/2007  INFOLINUX

   

thread safe. Ipv6. Cepat. Didokumentasikan dengan baik.

Untuk menggunakan libcurl, kita bisa mempergunakan bahasa C ataupun puluhan bahasa pemrograman lainnya (binding tersedia untuk lebih dari 30 bahasa pemrograman). Versi terbaru libcurl dan tool curl pada saat tulisan ini dibuat adalah 7.16.1 (29 Januari 2007).

Berikut ini adalah contoh-contoh pustaka untuk berbagai protokol populer lainnya:  libssh (untuk mengakses SSH service), http://www.0xbadc0de.be/libssh:libssh.  libspopc (POP3 mail client), http:// brouits.free.fr/libspopc/.  libyahoo2 (Yahoo! Messenger protocol), http://libyahoo2.sourceforge.net.  libirc (untuk mengakses IRC), http:// www.libirc.org.  UW IMAP (untuk bekerja dengan IMAP), http://www.cac.washington.edu/ imap/.  omniORB (CORBA), http://omniorb. sourceforge.net.  Dan lain sebagainya.

Situs web libyahoo2.

www.infolinux.web.id

UTAMA PROTOKOL HTTP DAN FTP Di bagian ini, kita akan membahas sekilas dua protokol yang cukup popular, yaitu HTTP dan FTP.

HTTP HTTP adalah singkatan dari HyperText Transfer Protocol, yang merupakan metode yang digunakan dalam transfer informasi di WWW. HTTP merupakan protokol request/response antara client dan server. Di antara server dan client, terdapat kemungkinan penengah, seperti proxy, gateway dan tunnel. Contoh HTTP server populer adalah Apache HTTP server. Contoh HTTP client populer adalah web browser seperti Mozilla Firefox. HTTP client sering pula disebut sebagai HTTP user agent. Versi protokol HTTP yang umum digunakan saat ini adalah HTTP/1.1 (Juni 1999). Secara default, server HTTP akan membangun koneksi TCP dan membuka port 80, kemudian menunggu request dari client. Setelah menerima request, server akan mengirimkan status, pesan tambahan, isi body yang diminta, dan informasi lainnya. Resource yang diakses oleh HTTP diidentifikasikan dengan URI http:. Tanpa menggunakan user agent modern, kita pun dapat merequest informasi kepada HTTP server. Contoh caranya adalah dengan menggunakan program telnet untuk melakukan koneksi ke port 80 dan memberikan perintah seperti GET /index.html HTTP/1.0. Contoh: $ telnet localhost 80 Trying 127.0.0.1... Connected to localhost. Escape character is ‘^]’. GET /index.html HTTP/1.0 HTTP/1.1 200 OK Date: Tue, 20 Feb 2007 05:04:41 GMT Server: Apache/2.2.3 (Unix) mod_ssl/2.2.3 OpenSSL/0.9.8d DAV/2 PHP/5.2.0 X-Powered-By: PHP/5.2.0 Content-Length: 44 Connection: close Content-Type: text/html

It works!


www.infolinux.web.id

Situs web libssh.

body>

Connection closed by foreign host.

Dalam hal ini, bind source port (oleh client) akan dilakukan untuk port acak di atas 1023.

FTP FTP adalah singkatan dari File Transfer Protocol, yang digunakan untuk menghubungkan dua komputer sehingga pengguna di komputer satu dapat mentransfer file ke/ dari komputer lainnya, termasuk memberikan perintah operasi file di komputer lainnya tersebut. Komputer yang menyediakan layanan disebut sebagai FTP server (membutuhkan program ftp server). Untuk melakukan koneksi ke FTP server, dibutuhkan software ftp client. Secara default, FTP server akan membangun koneksi TCP dan membuka port 21 untuk incoming connection dari client (membentuk control stream). Untuk transfer file aktual, koneksi yang berbeda diperlukan (data stream). Pengaturan data stream tergantung transfer mode:  Pada mode aktif, ftp client akan membuka port acak (di atas 1023), mengirimkan informasi port tersebut kepada ftp server, dan menunggu koneksi dari server. Pada saat FTP server menginisiasi data connection, bind ke port 20 server (source port) akan dilakukan.  Pada model pasif, ftp server akan membuka port acak (di atas 1023), mengirimkan informasi port tersebut kepada ftp client dan menunggu koneksi dari client.

Saat ini, terdapat sangat banyak ftp client (contoh: gFTP). Berbagai web browser populer, selain berfungsi sebagai HTTP client, juga berfungsi sebagai FTP client, walaupun mungkin tidak datang dengan fitur lengkap untuk FTP.

CLIENT HTTP DENGAN LIBCURL Berikut ini adalah contoh HTTP client sederhana, memanfaatkan pustaka libcurl. Fungsi utama program ini adalah mendownload URL tertentu. Hanya men-download saja, tanpa fitur tambahan (seperti resume, multithreading, dan lain sebagainya). Source code program http_client_simple.c: /* * simple_http_client * (c) Nop, GPL. */ #include <stdio.h> #include <curl/curl.h> int main (int argc, char * argv[]) { CURL * curl; CURLcode res; FILE * f;

INFOLINUX  04/2007

35

UTAMA membangun client ataupun server yang berjalan pada berbagai platform (multiplatform). Untuk contoh kasus server, lihatlah pada Apache HTTP server, web server paling banyak digunakan di dunia ini, yang mampu berjalan pada berbagai platform. Untuk contoh kasus client, lihatlah pada mozilla suite yang juga mampu berjalan pada sangat banyak platform. Ketika membangun suatu protokol, dimana merupakan hal yang sangat rumit, ada baiknya kalau kita mampu membangun protokol yang cukup netral dan tidak memihak platform tertentu, apabila memungkinkan. Bagaimanapun juga, ketika kita bekerja dengan jaringan, terdapat kemungkinan banyak platform saling bekerja sama. Ini sangatlah alami, seperti halnya kehidupan.

Situs web libirc.

if (argc != 3) { fprintf (stderr, “usage: simple_http_client

\n”); exit (1); } f = fopen (argv[2], “w”); curl = curl_easy_init(); if (curl) { curl_easy_setopt (curl, CURLOPT_URL, argv[1] ); curl_easy_setopt (curl, CURLOPT_WRITEDATA, f); res = curl_easy_ perform (curl); fclose (f); curl_easy_cleanup (curl); } return 0; }

Cara kompilasi: $ gcc -o http_client_simple http_ client_simple.c -lcurl

Cara menjalankan:

36

04/2007  INFOLINUX

$ ./http_client_simple usage: simple_http_client

Kebutuhan pustaka

Berikut ini adalah beberapa hal yang barangkali bisa menjadi pertimbangan, dalam konteks pengembangan aplikasi jaringan.

Idealnya, kita mempergunakan berbagai pustaka yang telah ada di dunia free software ini. Dengan demikian, kita tidak menulis ulang fungsionalitas yang telah ada. Tenaga yang ada bisa disumbangkan untuk penyempurnaan pustaka tersebut, ataupun membangun yang belum ada. Kita pun bisa lebih fokus pada fungsi utama program. Namun, harus diperhatikan juga kondisi dimana kita hanya membutuhkan sebagian kecil dari suatu pustaka berukuran besar (yang tidak terlalu modular). Dan, tentunya, dalam memilih pustaka, tentukan juga kriteria yang sesuai dengan kebutuhan. Untuk satu fungsionalitas, terkadang, terdapat beberapa pustaka tersedia. Pustaka-pustaka yang ada tersebut memiliki nilai plus minus masing-masing. Salah memilih pustaka bisa berdampak cukup besar pada program akhir.

Platform

Bahasa pemrograman

Untuk protokol yang standar dan matang, baik client ataupun server umumnya memiliki implementasi yang berjalan pada berbagai platform, mulai dari platform komputer besar sampai desktop. Kadangkadang, untuk aplikasi client, malah terdapat implementasi yang berjalan pada perangkat mobile. Ketika mengimplementasikan suatu protokol, ada baiknya kalau kita mampu

Bahasa pemrograman apa yang harus dipergunakan? Ini tentunya sangat bergantung kepada Anda sendiri, selaku sang programmer. Hanya, pertimbangkanlah berbagai hal berikut:  Kecepatan. Ketika Anda membutuhkan kecepatan tinggi, menggunakan bahasa C (compiled) barangkali lebih cocok dibandingkan dengan menggunakan bahasa Python (interpreted).

Contoh: $ ./http_client_simple http:// localhost/index.html out.html $ cat out.html

It works!

$ ./http_client_simple http:// localhost/apache_pb.gif out.gif $ file out.gif out.gif: GIF image data, version 89a, 259 x 32

ASPEK LAIN YANG PERLU DIPERHATIKAN

www.infolinux.web.id

UTAMA threading bisa berbeda antara satu dengan lainnya. Bahkan, tidak semua fitur tersedia pada setiap platform.

Front end

Situs web UW IMAP.

 Ruang kosong. Ketika Anda membangun untuk sistem embedded atau sistem kecil, maka ruang kosong menjadi sangat penting. Kalau Anda membangun menggunakan Perl atau Python, Anda membutuhkan puluhan mega byte harddisk. Ini belum ditambah pustaka eksternal. Kalau Anda menggunakan C, Anda mungkin hanya memerlukan ratusan KB (kompilasi statis) atau beberapa MB (kompilasi dinamis, telah memperhitungkan C library dan pustaka pendukung).

dan digunakan oleh banyak client, maka barangkali perlu dipikirkan juga tentang threading ataupun anak proses. Tergantung pada teknik yang lebih Anda sukai. Dalam membangun aplikasi client, sebagai contoh HTTP downloader, tak jarang teknik memanfaatkan anak proses ataupun memanfaatkan multithreading juga digunakan. Hanya, untuk isu seperti ini, developer diharapkan untuk sangat peduli terhadap isu perbedaan platform. Kode-kode untuk bekerja dengan anak proses atau multi-

Apabila memungkinkan, pisahkan antara user interface grafikal/text-based dengan fungsi utama program. Fungsi utama program, bisa berbentuk program biasa ataupun pustaka, hendaknya dikembangkan dengan sangat matang dan teliti. Selanjutnya, user interface bisa dikembangkan oleh siapa saja. Dengan memisahkan antara core program dengan front end, lebih mudah bagi developer lainnya untuk membangun user interface yang disukai. Bisa berbasis grafikal atau text based atau command line, tergantung pada developer dan target pengguna. Selain itu, dengan memisahkan core dan front end, kita juga bisa berkonsentrasi pada masing-masing hal tersebut dengan lebih baik lagi. Tulisan ini hanya membahas sangat sedikit dari dunia pemrograman jaringan di Linux. Banyak sekali hal yang bisa diexplore di dunia free/open source software. Ratusan pustaka, ratusan milis, ribuan developer dan masih banyak lagi siap membantu kita membangun program yang kita inginkan. Setelah itu, kita pun bisa membantu yang lain. Demikian seterusnya. Happy hacking!

Keamanan Dalam aplikasi jaringan, keamanan merupakan hal yang sangat penting. Dengan membuka satu port, kita telah membuka pintu ke komputer kita. Kita tidak ingin membangun aplikasi server yang mudah jebol hanya karena tindakan DoS sederhana. Begitupun dengan masalah alokasi memory. Atau aspek-aspek lainnya. Salah satu indahnya dunia free software adalah saling bantu antar-developer di seluruh dunia. Ketika kita merilis server kita sebagai free software, semakin banyak pihak yang bisa mengaudit kualitas program kita. Dan, tentunya, juga cukup banyak yang bisa membantu memperbaiki kelemahan yang ada.

Multithreading dan anak proses Ketika server Anda menjadi cukup serius

www.infolinux.web.id

Situs web omniORB.

INFOLINUX  04/2007

37