Perl - Pemrograman Socket

Apa itu Socket?

Socket adalah mekanisme Berkeley UNIX untuk membuat koneksi dupleks virtual antara proses yang berbeda. Ini kemudian porting ke setiap OS yang diketahui memungkinkan komunikasi antar sistem di seluruh lokasi geografis yang berjalan pada software OS yang berbeda. Jika bukan karena soket, sebagian besar komunikasi jaringan antar sistem tidak akan pernah terjadi.

Melihat lebih dekat; suatu sistem komputer pada suatu jaringan menerima dan mengirimkan informasi yang diinginkan oleh berbagai aplikasi yang berjalan di atasnya. Informasi ini dirutekan ke sistem, karena alamat IP unik ditetapkan untuk itu. Pada sistem, informasi ini diberikan ke aplikasi yang relevan, yang mendengarkan pada port yang berbeda. Misalnya browser internet mendengarkan pada port 80 untuk informasi yang diterima dari server web. Kami juga dapat menulis aplikasi kustom kami yang dapat mendengarkan dan mengirim / menerima informasi pada nomor port tertentu.

Untuk saat ini, mari kita simpulkan bahwa soket adalah alamat IP dan port, yang memungkinkan koneksi untuk mengirim dan menerima data melalui jaringan.

Untuk menjelaskan konsep soket yang disebutkan di atas, kita akan mengambil contoh Pemrograman Klien - Server menggunakan Perl. Untuk menyelesaikan arsitektur server klien kita harus melalui langkah-langkah berikut -

Untuk Membuat Server

  • Buat soket menggunakan socket panggilan.

  • Ikat soket ke alamat port menggunakan bind panggilan.

  • Dengarkan soket di alamat port menggunakan listen panggilan.

  • Terima koneksi klien menggunakan accept panggilan.

Untuk Membuat Klien

  • Buat soket dengan socket panggilan.

  • Hubungkan (soket) ke server menggunakan connect panggilan.

Diagram berikut menunjukkan urutan lengkap panggilan yang digunakan oleh Klien dan Server untuk berkomunikasi satu sama lain -

Panggilan Soket Sisi Server

Panggilan socket ()

Itu socket()panggilan adalah panggilan pertama dalam membuat koneksi jaringan membuat soket. Panggilan ini memiliki sintaks berikut -

socket( SOCKET, DOMAIN, TYPE, PROTOCOL );

Panggilan di atas membuat SOCKET dan tiga argumen lainnya adalah integer yang harus memiliki nilai berikut untuk koneksi TCP / IP.

  • DOMAINharus PF_INET. Kemungkinan 2 di komputer Anda.

  • TYPE harus SOCK_STREAM untuk koneksi TCP / IP.

  • PROTOCOL seharusnya (getprotobyname('tcp'))[2]. Ini adalah protokol khusus seperti TCP yang diucapkan melalui soket.

Jadi panggilan fungsi soket yang dikeluarkan oleh server akan menjadi seperti ini -

use Socket     # This defines PF_INET and SOCK_STREAM

socket(SOCKET,PF_INET,SOCK_STREAM,(getprotobyname('tcp'))[2]);

Panggilan bind ()

Soket yang dibuat oleh panggilan socket () tidak berguna sampai mereka terikat ke nama host dan nomor port. Server menggunakan yang berikut inibind() berfungsi untuk menentukan port di mana mereka akan menerima koneksi dari klien.

bind( SOCKET, ADDRESS );

Di sini SOCKET adalah deskriptor yang dikembalikan oleh panggilan socket () dan ADDRESS adalah alamat soket (untuk TCP / IP) yang mengandung tiga elemen -

  • Keluarga alamat (Untuk TCP / IP, itu adalah AF_INET, mungkin 2 di sistem Anda).

  • Nomor port (misalnya 21).

  • Alamat internet komputer (misalnya 10.12.12.168).

Karena bind () digunakan oleh server, yang tidak perlu mengetahui alamatnya sendiri sehingga daftar argumen terlihat seperti ini -

use Socket        # This defines PF_INET and SOCK_STREAM

$port = 12345;    # The unique port used by the sever to listen requests
$server_ip_address = "10.12.12.168";
bind( SOCKET, pack_sockaddr_in($port, inet_aton($server_ip_address)))
   or die "Can't bind to port $port! \n";

Itu or die klausa sangat penting karena jika server mati tanpa koneksi yang luar biasa, port tidak akan segera dapat digunakan kembali kecuali Anda menggunakan opsi SO_REUSEADDR menggunakan setsockopt()fungsi. Sinipack_sockaddr_in() fungsi digunakan untuk mengemas Port dan alamat IP ke dalam format biner.

Panggilan dengar ()

Jika ini adalah program server, maka diperlukan panggilan ke listen()pada port tertentu untuk mendengarkan, yaitu menunggu permintaan masuk. Panggilan ini memiliki sintaks berikut -

listen( SOCKET, QUEUESIZE );

Panggilan di atas menggunakan deskriptor SOCKET yang dikembalikan oleh panggilan socket () dan QUEUESIZE adalah jumlah maksimum permintaan koneksi luar biasa yang diizinkan secara bersamaan.

Panggilan accept ()

Jika ini adalah program server, maka diperlukan panggilan ke access()berfungsi untuk menerima koneksi masuk. Panggilan ini memiliki sintaks berikut -

accept( NEW_SOCKET, SOCKET );

Panggilan terima menerima deskriptor SOCKET yang dikembalikan oleh fungsi socket () dan setelah berhasil diselesaikan, deskriptor soket baru NEW_SOCKET dikembalikan untuk semua komunikasi di masa mendatang antara klien dan server. Jika akses () panggilan gagal, maka FLASE akan dikembalikan yang didefinisikan dalam modul Socket yang telah kita gunakan pada awalnya.

Umumnya, accept () digunakan dalam loop tak terbatas. Segera setelah satu koneksi tiba, server membuat proses anak untuk menghadapinya atau menyajikannya sendiri dan kemudian kembali untuk mendengarkan lebih banyak koneksi.

while(1) {
   accept( NEW_SOCKET, SOCKT );
   .......
}

Sekarang semua panggilan yang terkait dengan server selesai dan mari kita lihat panggilan yang akan dibutuhkan oleh klien.

Panggilan Socket Sisi Klien

Panggilan connect ()

Jika Anda akan menyiapkan program klien, maka pertama Anda akan menggunakan socket() panggilan untuk membuat soket dan kemudian Anda harus menggunakan connect()panggilan untuk terhubung ke server. Anda sudah melihat sintaks panggilan socket () dan itu akan tetap mirip dengan panggilan socket () server, tetapi di sini adalah sintaks untukconnect() panggil -

connect( SOCKET, ADDRESS );

Di sini SCOKET adalah deskriptor soket yang dikembalikan oleh panggilan soket () yang dikeluarkan oleh klien dan ALAMAT adalah alamat soket yang mirip dengan panggilan bind , kecuali bahwa ini berisi alamat IP dari server jauh.

$port = 21;    # For example, the ftp port
$server_ip_address = "10.12.12.168";
connect( SOCKET, pack_sockaddr_in($port, inet_aton($server_ip_address)))
   or die "Can't connect to port $port! \n";

Jika Anda berhasil terhubung ke server, maka Anda dapat mulai mengirim perintah Anda ke server menggunakan deskriptor SOCKET, jika tidak, klien Anda akan keluar dengan memberikan pesan kesalahan.

Klien - Contoh Server

Berikut ini adalah kode Perl untuk mengimplementasikan program klien-server sederhana menggunakan soket Perl. Di sini server mendengarkan permintaan masuk dan begitu koneksi dibuat, itu hanya menjawab Senyum dari server . Klien membaca pesan itu dan mencetak di layar. Mari kita lihat bagaimana ini dilakukan, dengan asumsi kita memiliki server dan klien kita pada mesin yang sama.

Script untuk Membuat Server

#!/usr/bin/perl -w
# Filename : server.pl

use strict;
use Socket;

# use port 7890 as default
my $port = shift || 7890;
my $proto = getprotobyname('tcp');
my $server = "localhost";  # Host IP running the server

# create a socket, make it reusable
socket(SOCKET, PF_INET, SOCK_STREAM, $proto)
   or die "Can't open socket $!\n";
setsockopt(SOCKET, SOL_SOCKET, SO_REUSEADDR, 1)
   or die "Can't set socket option to SO_REUSEADDR $!\n";

# bind to a port, then listen
bind( SOCKET, pack_sockaddr_in($port, inet_aton($server)))
   or die "Can't bind to port $port! \n";

listen(SOCKET, 5) or die "listen: $!";
print "SERVER started on port $port\n";

# accepting a connection
my $client_addr;
while ($client_addr = accept(NEW_SOCKET, SOCKET)) {
   # send them a message, close connection
   my $name = gethostbyaddr($client_addr, AF_INET );
   print NEW_SOCKET "Smile from the server";
   print "Connection recieved from $name\n";
   close NEW_SOCKET;
}

Untuk menjalankan server dalam mode latar belakang, jalankan perintah berikut pada prompt Unix -

$perl sever.pl&

Script untuk Membuat Klien

!/usr/bin/perl -w
# Filename : client.pl

use strict;
use Socket;

# initialize host and port
my $host = shift || 'localhost';
my $port = shift || 7890;
my $server = "localhost";  # Host IP running the server

# create the socket, connect to the port
socket(SOCKET,PF_INET,SOCK_STREAM,(getprotobyname('tcp'))[2])
   or die "Can't create a socket $!\n";
connect( SOCKET, pack_sockaddr_in($port, inet_aton($server)))
   or die "Can't connect to port $port! \n";

my $line;
while ($line = <SOCKET>) {
   print "$line\n";
}
close SOCKET or die "close: $!";

Sekarang mari kita mulai klien kita pada prompt perintah, yang akan terhubung ke server dan membaca pesan yang dikirim oleh server dan menampilkan hal yang sama di layar sebagai berikut -

$perl client.pl
Smile from the server

NOTE - Jika Anda memberikan alamat IP sebenarnya dalam notasi titik, disarankan untuk memberikan alamat IP dalam format yang sama di klien dan server untuk menghindari kebingungan.