Datagram
socket merupakan protocol yang unreliable (tidak handal). Ketika
paket data dikirimkan, UDP tidak mengecek kembali apakah data yang dikirim
sampai tujuan. Jadi dengan UDP tidak ada kepastian bagi sisi pengirim bahwa
datanya sudah sampai ke tujuan dengan keadaan baik. 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.
UDP menyediakan mekanisme untuk mengirim pesan-pesan ke sebuah protokol lapisan aplikasi
atau proses tertentu di dalam sebuah host dalam jaringan yang menggunakan
TCP/IP. Header UDP berisi field Source Process Identification dan Destination
Process Identification.
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:
1.
Simpan
source program client dengan nama client2.c dan server dengan nama server2.c
2.
Lakukan
installasi gcc yang sudah dijelaskan pada artikel sebelumnya.
3.
Lakukan
kompilasi pada program.
4. #gcc client2.c -o client2
5. #gcc server2.c -o server2
6.
Jalankan
program server, kemudian jalankan program client pada komputer client.
7. #./server2
8. #./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.
Referensi:
Materi V-Class Gunadarma: Datagram Socket Programming
Tidak ada komentar:
Posting Komentar