Prakt Modul 9 Stream Socket Programming
Prakt Modul 9 Stream Socket Programming
I. Tujuan
1. Mahasiswa memahami konsep aplikasi client server di jaringan.
2. Mahasiswa memahami konsep pemprograman socket.
3. Mahasiswa memahami jenis – jenis socket programming
4. Mahasiswa mampu membangun program socket sederhana
1
server server
Transport Transport
Internet Internet
Network Interface Network Interface
internet
Pada mesin keluarga Linux, socket terintegrasi dengan I/O sehingga aplikasi
yang berkomunikasi dengan socket, cara kerjanya sama dengan suatu aplikasi
yang mengakses peralatan I/O. Oleh karena itu untuk memahami cara kerja
socket pada Linux, sebelumnya harus juga memahami fasilitas I/O pada Linux.
2
Pada saat suatu aplikasi berkomunikasi, awalnya aplikasi membuat socket baru,
maka pada aplikasi tersebut akan diberikan nomer yang digunakan sebagai
referensi socket. Jika ada suatu sistem yang menggunakan nomer referensi
socket tersebut, maka akan terjalin suatu jaringan komunikasi antar komputer
sebaik transfer data lokal.
Untuk berkomunikasi dengan server, client harus tahu nomor IP server begitu
juga nomor port yang dituju, nomor port menunjukkan service yang dijalankan.
Contoh port 23 untuk Telnet Server, port 25 untuk Mail Server dan port 80
untuk Web Server. Dalam hal ini aplikasi di client sudah mengetahui port yang
akan dituju. Contoh program aplikasi di client yang meminta service di server
ada;ah ftp, telnet, ssh. Untuk melihat service bisa dilihat pada file /etc/services.
Program yang berjalan di server, akan berjalan sepanjang waktu (disebut sebagai
daemon) sampai mesin/service dimatikan, menunggu request dari client sesuai
service yang diminta.
3
Jadi 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. Socket pertama kali diperkenalkan di sistem Unix
BSD versi 4.2 tahun 1983 sebagai kelanjutan dari implementasi protokol TCP/IP
yang muncul pertama kali pada sistem Unix BSD 4.1 pada akhir 1981. Hampir
setiap varian Unix dan Linux mengadopsi BSD Socket.
4
2. Langkah – langkah dasar di server :
a. Membuat socket dengan perintah socket()
b. Mengikatkan socket kepada sebuah alamat network dengan perintah
bind()
c. Menyiapkan socket untuk menerima koneksi yang masuk dengan
perintah listen()
d. Menerima koneksi yang masuk ke server dengan perintah accept()
e. Melakukan komunikasi (mengirim dan menerima data), dengan
menggunakan perintah write() dan read()
Struktur Pengalamatan
Jaringan komputer dalam melakukan pengiriman data bisa diilustrasikan sebagai
pengiriman surat. Supaya surat bisa terkirim secara benar maka alamat pengirim
dan penerima harus tertulis dengan jelas dan lengkap.
Begitu juga dalam koneksi di socket, diperlukan variable yang dipakai untuk
menyimpan address client dan server. Variable yang dipakai berupa structure
sockaddr dan sockaddr_in pada include socket.h di direktory /usr/include/sys.
Address ini akan dipakai pada waktu melakukan connect(), bind() dan accept().
Dibawah ini adalah structute yang dipakai.
struct sockaddr {
unsigned short sa_family; /* protocol family */
char sa_data[14]; /* address data. */
};
struct sockaddr_in {
unsigned short sin_family; /* address family (always AF_INET)
*/
unsigned short sin_port; /* port num in network byte order */
struct in_addr sin_addr; /* IP addr in network byte order */
unsigned char sin_zero[8]; /* pad to sizeof(struct sockaddr) */
};
Contoh pemakaian struktur tersebut bisa dilihat pada tabel berikut ini:
struct sockaddr_in serveraddr;
/* fill in serveraddr with an address */
…
/* Connect takes (struct sockaddr *) as its second argument */
connect(clientfd, (struct sockaddr *) &serveraddr,
sizeof(serveraddr));
…
5
if ((clientfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
return -1; /* check errno for cause of error */
/* Fill in the server's IP address and port */
if ((hp = gethostbyname(hostname)) == NULL)
return -2; /* check h_errno for cause of error */
bzero((char *) &serveraddr, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
bcopy((char *)hp->h_addr,
(char *)&serveraddr.sin_addr.s_addr, hp->h_length);
serveraddr.sin_port = htons(port);
/* Establish a connection with the server */
if (connect(clientfd, (struct sockaddr *) &serveraddr,
sizeof(serveraddr)) < 0)
return -1;
return clientfd;
}
6
2. Melakukan komunikasi (mengirim dan menerima data), dengan
menggunakan perintah write() dan read()
if (write(sockfd, buff, strlen(buff))<0)
{
close(sockfd);
exit(1);
}
7
on any IP address for this host */
bzero((char *) &serveraddr, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
serveraddr.sin_port = htons((unsigned short)port);
if (bind(listenfd, (SA *)&serveraddr, sizeof(serveraddr)) <
0)
return -1;
/* Make it a listening socket ready to accept
connection requests */
if (listen(listenfd, LISTENQ) < 0)
return -1;
return listenfd;
}
b. Melakukan pengalamatan.
struct sockaddr_in serveraddr; /* server's socket addr */
...
/* listenfd will be an endpoint for all requests to port
on any IP address for this host */
bzero((char *) &serveraddr, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
serveraddr.sin_port = htons((unsigned short)port);
8
2. Looping utama adalah menerima koneksi, dan melakukan komunikasi data
(mengirim dan menerima).
main() {
/* create and configure the listening socket */
while(1) {
/* Accept(): wait for a connection request */
/* echo(): read and echo input lines from client til EOF */
/* Close(): close the connection */
}
}
9
3. Menutup socket.
V. Percobaan
1. Denga memakai editor vi tuliskan kembali program di bawah ini. Ada dua
bagian program, client dan server. Simpan sesuai dengan nama yang ada
pada comment program.
# vim /home/client.c
/*
** client.c -- program client sederhana menggunakan stream socket
*/
#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>
if (argc != 2) {
fprintf(stderr,"usage: client hostname\n");
exit(1);
}
if ((he=gethostbyname(argv[1])) == NULL) { // mencari info tentang host
perror("gethostbyname");
exit(1);
}
10
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(1);
}
/*
** server.c -- program server sederhana menggunakan stream socket
*/
#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>
void sigchld_handler(int s)
{
while(wait(NULL) > 0);
}
11
int main(void)
{
int sockfd, new_fd; // sock_fd ---> koneksi saat ini, new_fd ----> koneksi
baru
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 (setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int)) == -1)
{
perror("setsockopt");
exit(1);
}
12
if (!fork()) { // jika child process
close(sockfd); // child process tidak perlu listener
if (send(new_fd, "Pengiriman data dengan stream socket berhasil!\n", 50, 0)
== -1)
perror("send");
close(new_fd);
exit(0);
}
close(new_fd); // menutup process
}
return 0;
}
9. Berikan komentar tiap baris pada program tersebut apa maksud dan
kegunaan perintah diatas bila dihubungkan dengan stream socket (masukkan
dalam laporan resmi).
Daftar Pertanyaan
13
1. Berikan kesimpulan praktikum yang anda lakukan.
2. Buatlah program memakai stream socket yang bisa mengirimkan inputan berupa
character dari client dan diterima server kemudian ditampilkan di server apa
yang dikirim client tersebut.
14