Program
Stream Socket
Cangkupan mengenai socket dapat melakukan komunikasi antar
proses/program melalui jaringan berbasis yang TCP/IP tentunya, bahkan dengan
program lain yang berjalan pada platform non-unix seperti Microsoft Windows,
sepanjang program tersebut berbicara dalam protokol transfer yang sama.
Fasilitas-fasilitas yang disediakan oleh mesin unix seperti rlogin, ssh, ftp,
dan lain-lain menggunakan socket sebagai sarana komunikasi mereka. Socket
dibentuk dan digunakan dengan cara yang berbeda. Komunikasi socket terutama
diciptakan untuk tujuan menjembatani komunikasi antara dua buah program yang
dijalankan pada mesin yang berbeda.
Socket
sendiri merupakan suatu 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:
Pada listing program di atas
menyatakan bahwa membuat suatu cangkupan client yang akan di arahkan terhadap
server dengan hostname dimana pada port ketentuan yang sudah tetap, yang
mendefinisikan dalam perintah membuat suatu socket dengan pengalamatan antara
client ke server dan melakukan suatu perintah terdefinisi yaitu konfirgurasi
conecting terhadap server.
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 listing diatas
menyatakan bahwa program server akan melakukan prosedur dengan syarat yaitu
melakukan pembukaan koneksi yang terdapat didalamnya yaitu berupa suatu
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