Program Datagram Socket
Pada sistem operasi linux ada banyak socket, tetapi ada dua yang paling
utama yaitu stream socket dan datagram socket. Stream socket digunakan untuk
sistem komunikasi dua arah dan menggunakan protokol TCP (Transmission Control
Protocol). Pembahasan mengenai Stream Socket dan implementasinya sudah dibahas
pada artikel sebelumnya, Contoh aplikasi yang menggunakan stream socket
adalah telnet dan HTTP (web browser). TCP menjamin data terkirim secara urut
dan bebas dari error, sedangkan IP (Internet Protocol) bertugas untuk mengatur
lalu-lintas routing.
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:
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
Sumber :
http://salmaann.blogspot.com/2014/05/program-datagram-socket.html
Tidak ada komentar:
Posting Komentar