Program Stream Socket
Socket adalah 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
1.
Simpan program client dengan nama client.c dan program server dengan nama
server.c
2.
Lakukan installasi gcc atau compiler untuk bahasa c lainnya (pada artikel
ini menggunakan os fedora)
3.
#yum install gcc
4.
Lakukan kompilasi program
5.
#gcc client.c -o client
6.
#gcc server.c -o server
7.
Jalankan program server, kemudian jalankan program client
8.
#./server
9.
#./client <ip server>
Berikut tampilan outputnya
·
Client
·
Server
Sumber:
Tidak ada komentar:
Posting Komentar