Socket
programming merupakan pemrogramman yang bertujuan agar satu program dapat
berinteraksi dengan program lainnya dalam satu jaringan. Penggunaan socket
programming memungkinkan adanya komunikasi antara client dan server. Salah satu
contohnya sederhana penggunaan socket programming adalah pembuatan program
untuk chatting. Program tersebut sebenarnya merupakan bentuk aplikasi
komunikasi antara server dan client. Berikut adalah contoh socket programming
client server yang dibuat menggunakan 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
#define
MAXDATASIZE 100
Bagian diatas ini merupakan deskripsi dari nomor port yang
digunakan yaitu “3333” dan dibawahnya adalah jumlah byte maksimal yang
dikirimkan.
int main(int argc, char const *argv[])
{
int sockfd, numbytes;
char buf[MAXDATASIZE];
struct hostent *he;
struct sockaddr_in
their_addr;
Blok diatas berisikan informasi alamat dari server.
if (argc != 2)
{
fprintf(stderr, "usage: client
hostname\n");
exit(1);
}
if ((he=gethostbyname(argv[1])) == NULL)
{
perror("gethostbyname");
exit(1);
}
Blok diatas untuk
mencari info tentang host.
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket");
exit(1);
}
Blok diatas untuk
membuat socket dengan perintah socket. “AF_NET” menunjukkan bahwa socket
dihubungkan dengan protocol internet, dan “SOCK_STREAM” menunjukkan bahwa
program ini memakai stream socket atau TCP, yang berarti connection oriented.
their_addr.sin_family = AF_INET;
their_addr.sin_port = htons(PORT);
their_addr.sin_addr = *((struct in_addr *)he->h_addr);
memset(&(their_addr.sin_zero), '\0', 8);
Pada
baris awal yaitu untuk host byte order atau big endian. Baris selanjutnya untuk
network byte order. Dan yang lainnya diisi 0.
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;
}
Blok program
diatas merupakan proses koneksi ke server untuk melakukan proses pengiriman
data ke server dengan perintah connect(). Selanjutnya terdapat proses
penerimaan data yang datang dari server dengan perintah “recv”. Dan diakhiri
dengan menutup hubungan dengan perintah close().
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
#define BACKLOG
10
Bagian diatas ini merupakan deskripsi dari nomor port yang
digunakan yaitu “3333” dan dibawahnya adalah jumlah koneksi yang diperbolehkan.
void sigchld_handler(int s)
{
while(wait(NULL) > 0);
}
int main(void)
{
int sockfd, new_fd;
struct sockaddr_in
my_addr;
struct sockaddr_in
their_addr;
int sin_size;
struct sigaction
sa;
int yes=1;
Pada blok diatas
terdapat “sockfd” yang merupakan koneksi saat ini dan “newfd” merupakan koneksi
baru. Baris selanjutnya merupakan penetapan ip address server dan dilanjutkan
penetapan ip address dari client.
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket");
exit(1);
}
Blok di atas adalah untuk membuat socket
dengan perintah socket(). “AF_NET” menunjukkan bahwa socket dihubungkan dengan protocol internet, dan “SOCK_STREAM” menunjukkan bahwa program ini memakai stream socket atau TCP, yang berarti connection oriented.
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1)
{
perror("setsockopt");
exit(1);
}
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(MYPORT);
my_addr.sin_addr.s_addr = INADDR_ANY;
memset(&(my_addr.sin_zero), '\0', 8);
Blok
diatas untuk melakukan proses pengalamatan. Pada baris awal yaitu untuk host
byte order atau big endian. Baris selanjutnya untuk network byte order. Baris ketiga
disi dengan ip address server. Dan yang lainnya diisi 0.
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
{
perror("bind");
exit(1);
}
Blok di atas adalah
untuk mengikatkan socket kepada sebuah alamat network dengan perintah bind().
if (listen(sockfd, BACKLOG) == -1)
{
perror("listen");
exit(1);
}
Blok
di atas adalah untuk menerima koneksi yang masuk dengan perintah listen().
sa.sa_handler = sigchld_handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_RESTART;
if (sigaction(SIGCHLD, &sa, NULL) == -1)
{
perror("sigaction");
exit(1);
}
while(1)
{
sin_size = sizeof(struct sockaddr_in);
if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1)
{
perror("accept");
continue;
}
Blok di atas adalah untuk menerima koneksi
yang masuk meserver dengan perintah accept().
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);
exit(0);
}
Blok di atas
adalah untuk melakukan proses komunikasi dengan client yaitu proses menerima
dan mengirim data dengan perintah read(). Lalu menutup socket.
close(new_fd);
}
return 0;
}
LANGKAH-LANGKAH
MENJALANKAN PROGRAM
1. Simpan program
client dengan nama client.c dan program server dengan server.c.
2. Lakukan instalasi
gcc atau compiler untuk bahasa c lainnya (menggunakan os fendora) :
·
#yum
install gcc
3.
Lakukan kompilasi
program :
·
#gcc
client.c –o client
·
#gcc
server.c –o server
4.
Jalankan program
server lalu dilanjutkan dengan menjalankan program client :
·
#./server
·
#./client
<ip server>
OUTPUT SERVER DAN CLIENT