Program Datagaram 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.
- Untuk 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().
-
Untuk 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:
1. Untuk Client
2. Untuk Server
Tidak ada komentar:
Posting Komentar