Stream Socket
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.
- 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;
}
- 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 dan 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.
Pada 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().
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)
3. #yum install gcc
- Lakukan kompilasi program
5. #gcc client.c -o client
6. #gcc server.c -o server
- Jalankan program server, kemudian jalankan program
client
8. #./server
9. #./client <ip server>
maka outputnya
adalah sebagai berikut :
- Server
- Client
Sumber :
Tidak ada komentar:
Posting Komentar