Program
Datagram Socket
TUGAS
JARKOM LANJUT
PENDAHULUAN
Penggunaan socket programming memungkinkan adanya komunikasi
antara client dan server. Salah satu contoh sederhana penggunaan socket
programming adalah pembuatan program untuk chatting. Program tersebut
sebenarnya merupakan bentuk aplikasi berupa komunikasi antara client dan
server. Ketika seorang user (client) melakukan koneksi ke chat server, program
akan membuka koneksi ke port yang diberikan, sehingga server perlu membuka
socket pada port tersebut dan “mendengarkan” koneksi yang datang. Socket
sendiri merupakan gabungan antara host-adress dan port adress. Dalam hal ini
socket digunakan untuk komunikasi antara client dan server.
Proses datagram
Jika client mengirimkan data ke server, data tersebut ada
kemungkinan sampai ke server atau tidak. Untuk
ituclient menunggu isyarat ‘error free’ daripada client.
Jika client tidak menerima isyarat ‘error free’ dalam satu
jangka waktu, maka clientakan mengirimkan lagi data tersebut. Contoh
aplikasi yang menggunakan datagram socket adalah tftp dan bootp.
Data yang dikirimkan
melalui datagram socket akan melalui proses yang diberi nama
enkapsulasi (data encapsulation). Data yang akan dikirimkan sebelumnya
dibungkus dulu dengan sebuah header dari protokol yang pertama
(misalnya TFTP), lalu dibungkus lagi dengan protokol berikutnya (misalnya UDP),
lalu IP dan yang terakhir dibungkus dengan ethernet protokol pada physical
layer.
Algorithma
pemprograman datagram socket
Pada socket datagram algoritmanya lebih
sederhana, tidak memerlukan sambungan antara server dan client.
Sehingga system call/function yang diperlukan, iaitu socket(),
bind(), sendto() dan recvfrom(), sendto() dan recvfrom() adalah fungsi khusus
yang digunakan untuk mengirim dan menerima data pada socket datagram.
Antara langkah – langkah yang dilakukan
pada client dan server, pada socket datagram adalah
seperti berikut :
1. Langkah – langkah di client :
a. Membuka connection client ke server, yang di dalamnya adalah :
i. Membuat socket dengan perintah socket().
ii. Melakukan pengalamatan ke server.
b. Melakukan komunikasi (mengirimkan data), dengan menggunakan perintah sendto()
c. Menutup hubungan dengan perintah close();
2. Langkah – langkah di server :
a. Membuat socket dengan perintah socket()
b. Mengikatkan socket kepada sebuah alamat network dengan perintah bind()
c. Melakukan komunikasi (menerima data), dengan menggunakan perintah recvfrom()
a. Membuka connection client ke server, yang di dalamnya adalah :
i. Membuat socket dengan perintah socket().
ii. Melakukan pengalamatan ke server.
b. Melakukan komunikasi (mengirimkan data), dengan menggunakan perintah sendto()
c. Menutup hubungan dengan perintah close();
2. Langkah – langkah di server :
a. Membuat socket dengan perintah socket()
b. Mengikatkan socket kepada sebuah alamat network dengan perintah bind()
c. Melakukan komunikasi (menerima data), dengan menggunakan perintah recvfrom()
Jenis socket yang kedua yaitu datagram socket
disebut juga connectionless socket sebab untuk interaksi client-server tidak
harus selalu terhubung terus menerus. Jika client mengirimkan data ke server,
data tersebut ada kemungkinan sampai ke server atau tidak. Untuk itu client
menunggu sinyal ‘error free’ dari client. Jika client tidak menerima sinyal ‘error
free’ dalam suatu kurun waktu, maka client akan mengirimkan lagi data tersebut.
Contoh aplikasi yang menggunakan datagram socket adalah tftp dan bootp.
Berikut contoh program client server yang menggunakan datagram socket yang dibuat dengan bahasa C.
Client
/*
** client02.c -- a datagram
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#define MYPORT 4950 // no port server yang digunakan
int main(int argc, char *argv[])
{
int
sockfd;
struct
sockaddr_in their_addr; // ip server
struct
hostent *he;
int
numbytes;
if (argc
!= 3)
{
fprintf(stderr,"usage: client hostname message\n");
exit(1);
}
// dpt
info tentang host
if
((he=gethostbyname(argv[1])) == NULL)
{
perror("gethostbyname");
exit(1);
}
if
((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
{
perror("socket");
exit(1);
}
their_addr.sin_family = AF_INET; // host byte order
their_addr.sin_port = htons(MYPORT); // host to network short
their_addr.sin_addr = *((struct in_addr *)he->h_addr);
memset(&(their_addr.sin_zero), '\0', 8); // set semua nilai ke 0
if
((numbytes=sendto(sockfd, argv[2], strlen(argv[2]), 0, (struct sockaddr
*)&their_addr, sizeof(struct sockaddr))) == -1)
{
perror("sendto");
exit(1);
}
printf("Kirim %d byte ke %s\n", numbytes,
inet_ntoa(their_addr.sin_addr));
close(sockfd);
return 0;
}
Berikut penjelasan dari program client:
Program ini memberikan paket kepada alamat server
yang ditentukan melalui parameter pada saat dijalankan. Didalamnya termasuk
membuat socket dengan memanfaatkan system call yang tersedia seperti socket(),
listen() dan connect().
Server
/*
** server02.c -- a datagram sockets
"server"
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define MYPORT 4950 // no port server
#define MAXBUFLEN 100
int main(void)
{
int
sockfd;
struct
sockaddr_in my_addr; // ip address server
struct sockaddr_in their_addr; // ip address
client
int
addr_len, numbytes;
char
buf[MAXBUFLEN];
if
((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
{
perror("socket");
exit(1);
}
my_addr.sin_family = AF_INET; // host byte order
my_addr.sin_port = htons(MYPORT); // host to network short
my_addr.sin_addr.s_addr = INADDR_ANY; // ip address server
memset(&(my_addr.sin_zero), '\0', 8); // set semua nilai menjadi 0
if
(bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
{
perror("bind");
exit(1);
}
addr_len =
sizeof(struct sockaddr);
if
((numbytes=recvfrom(sockfd,buf, MAXBUFLEN-1, 0, (struct sockaddr
*)&their_addr, &addr_len)) == -1)
{
perror("recvfrom");
exit(1);
}
printf("Mendapat paket dari :
%s\n",inet_ntoa(their_addr.sin_addr));
printf("Panjang paket : %d bytes \n",numbytes);
buf[numbytes] = '\0';
printf("Isi paket : \"%s\"\n",buf);
close(sockfd);
return 0;
}
Berikut penjelasan dari program server:
Pada program server menggunakan socket untuk
mendapatkan file descriptor dan menghitung jumlah paket dan memberikan
informasi tersebut pada saat dijalankan, serta menggunakan memanfaatkan banyak
system call seperti socket(), bind(), listen(), connect(), dll.
Langkah-langkah menjalankan program:
Simpan source program client dengan nama client2.c
dan server dengan nama server2.c
Lakukan kompilasi pada program.
#gcc client2.c -o client2
#gcc server2.c -o server2
Jalankan program server, kemudian jalankan program
client pada komputer client.
#./server2
#./client2 <alamat ip server> <pesan tanpa
spasi/dalam tanda kutip>
Berikut tampilan outputnya:
Client
Server
Mengecek port yang digunakan oler server dengan menggunakan perintah berikut:
# netstat -nlptu | grep server2
Berikut tampilan outputnya:
Dari output tersebut dapat terlihat bahwa program server melakukan listening menggunakan port 4950 dan menggunakan protokol udp.
Selanjutnya mengecek port yang digunakan oleh client dengan menggunakan perintah berikut:
# tcpdump -nt -i (interface yang digunakan)
Berikut tampilan outputnya:
Dari output tersebut terlihat bahwa program client menggunakan port 53341 yang merupakan random port apabila program client dijalankan kembali maka port yang digunakan akan berubah.
Tidak ada komentar:
Posting Komentar