Socket merupakan mekanisme komunikasi yang memungkinkan
terjadinya pertukaran data antar program atau proses baik dalam satu mesin
maupun antar mesin. Gaya pemrograman soket sendiri berawal dari sistem Unix BSD
yang terkenal dengan kepeloporannya pada bidang penanganan jaringan, sehingga
sering disebut BSD Socket.
Sedangkan Socket Stream adalah socket komunikasi full-duplex
berbasis aliran (stream) data. Pada model komunikasi Socket Stream, koneksi dua
aplikasi harus dalam kondisi tersambung dengan benar untuk dapat bertukar data.
Ini dapat dianalogikan seperti komunikasi telepon. Jika sambungan telepon di
salah satu titik putus, maka komunikasi tidak dapat terjadi. Koneksi model
seperti ini akan menjamin data dapat dipertukarkan dengan baik, namun memiliki
kelemahan dalam hal penggunaan jalur data yang relatif besar dan tidak boleh
terputus.
Berikut contoh program client server yang menggunakan stream
socket yang dibuat dengan bahasa C.
Client
#include
<stdio.h>
#include
<stdlib.h>
#include
<unistd.h>
#include
<errno.h>
#include
<string.h>
#include
<netdb.h>
#include
<sys/types.h>
#include
<netinet/in.h>
#include
<sys/socket.h>
#define PORT 3333
//nomor port yang digunakan
#define MAXDATASIZE 100
//jumlah bytes yang dapat dikirimkan
int main(int argc, char
const *argv[])
{
int sockfd, numbytes;
char buf[MAXDATASIZE];
struct hostent *he;
struct sockaddr_in their_addr; //informasi
alamat server
if (argc != 2)
{
fprintf(stderr, "usage: client
hostname\n");
exit(1);
}
if ((he=gethostbyname(argv[1])) == NULL)
//mencari informasi tentang host
{
perror("gethostbyname");
exit(1);
}
if ((sockfd = socket(AF_INET, SOCK_STREAM,
0)) == -1)
{
perror("socket");
exit(1);
}
their_addr.sin_family = AF_INET; //host
byte order
their_addr.sin_port = htons(PORT); //short,
network byte order
their_addr.sin_addr = *((struct in_addr
*)he->h_addr);
memset(&(their_addr.sin_zero), '\0',
8);
if (connect(sockfd, (struct sockaddr
*)&their_addr, sizeof(struct sockaddr)) == -1)
{
perror("connect");
exit(1);
}
if ((numbytes=recv(sockfd, buf,
MAXDATASIZE-1, 0)) == -1)
{
perror("recv");
exit(1);
}
buf[numbytes] = '\0';
printf("Received: %s", buf);
close(sockfd);
return 0;
}
Berikut Penjelasan dari program Client :
Program ini membuatkan client ke server pada hostname:port
tertentu. Di dalamnya termasuk membuat socket, melakukan pengalamatan ke server
dan melakukan koneksi ke server dengan perintah connect().
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>
#include
<sys/wait.h>
#include
<signal.h>
#define MYPORT 3333
//nomor port yang digunakan
#define BACKLOG 10
//jumlah koneksi yang diperbolehkan
void
sigchld_handler(int s)
{
while(wait(NULL) > 0);
}
int main(void)
{
int sockfd, new_fd; //membuat dan
mempertahankan koneksi
struct sockaddr_in my_addr; //ip address
server
struct sockaddr_in their_addr; //ip address
client
int sin_size;
struct sigaction sa;
int yes=1;
if ((sockfd = socket(AF_INET, SOCK_STREAM,
0)) == -1)
{
perror("socket");
exit(1);
}
if (setsockopt(sockfd, SOL_SOCKET,
SO_REUSEADDR, &yes, sizeof(int)) == -1)
{
perror("setsockopt");
exit(1);
}
my_addr.sin_family = AF_INET; //host byte
order atau big endian
my_addr.sin_port = htons(MYPORT); //short,
network byte order
my_addr.sin_addr.s_addr = INADDR_ANY;
//diisi dengan ip address server
memset(&(my_addr.sin_zero), '\0', 8);
if (bind(sockfd, (struct sockaddr
*)&my_addr, sizeof(struct sockaddr)) == -1)
{
perror("bind");
exit(1);
}
if (listen(sockfd, BACKLOG) == -1)
{
perror("listen");
exit(1);
}
sa.sa_handler = sigchld_handler;
//menghander dead process
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_RESTART;
if (sigaction(SIGCHLD, &sa, NULL) ==
-1)
{
perror("sigaction");
exit(1);
}
while(1) //menerima koneksi dengan looping
{
sin_size = sizeof(struct sockaddr_in);
if ((new_fd = accept(sockfd, (struct
sockaddr *)&their_addr, &sin_size)) == -1)
{
perror("accept");
continue;
}
printf("server: got connection
from %s\n", inet_ntoa(their_addr.sin_addr));
if (!fork())
{
close(sockfd);
if (send(new_fd, "Pengiriman
data dengan stream socket berhasil!\n", 14, 0) == -1)
{
perror("send");
}
close(new_fd); //menutup proses
exit(0);
}
close(new_fd);
}
return 0;
}
Berikut penjelasan Dari program Server :
Pada program server, program ini melakukan prosedur
pembukaan koneksi yang di dalamnya berupa langkah-langkah seperti membuat
socket, mengikat socket, menyiapkan socket, menerima koneksi, dan pengalamatan
socket.
Langkah-langkah menjalankan program
Simpan program client dengan nama client.c dan program
server dengan nama server.c
Lakukan installasi gcc atau compiler untuk bahasa c lainnya
(pada artikel ini menggunakan os fedora)
#yum install gcc
Lakukan kompilasi program
#gcc client.c -o client
#gcc server.c -o server
Jalankan program server, kemudian jalankan program client
#./server
#./client <ip
server>
Berikut tampilan outputnya :
Client
Server
Tidak ada komentar:
Posting Komentar