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:
- Simpan source program client dengan nama client2.c dan server dengan nama server2.c
- Lakukan installasi gcc yang sudah dijelaskan pada artikel sebelumnya.
- 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.
Referensi:
Materi V-Class Gunadarma: Datagram Socket Programming
0 komentar:
Posting Komentar