I. Tujuan
1. Mahasiswa memahami konsep Stream Socket.
2. Mahasiswa memahami konsep koneksi pada pemprograman socket.
3. Mahasiswa memahami tipe – tipe koneksi server pada pemprograman
socket.
4. Mahasiswa mampu membangun program socket sederhana memakai tipe
koneksi yang ada.
Pada stream socket dalam melakukan koneksi salah satu prosedur yang penting
adalah accept(), yang dipakai untuk menerima koneksi dari client. Pada server
dikenal beberapa tipe penerimaan koneksi yaitu :
Iterating Server
Concurrent Server
Iterating Server
Pada iterating server hanya dimungkinkan satu socket yang dibuka pada satu
waktu. Setelah proses koneksi selesai, socket ditutup dan koneksi yang lain baru
bisa diterima.
110
Gambar 11.1 berikut adalah ilustrasi koneksi dua client menggunakan iterating
server.
Concurrence Server
111
Berbeda dengan Iterating server yang hanya bisa menerima koneksi satu pada
satu waktu, concurrence server bisa memungkinkan melakukan beberapa
koneksi dalam satu waktu.
V. Percobaan
1. Dengan memakai editor vi tuliskan kembali program di bawah ini. Simpan
sesuai dengan nama yang ada pada comment program
/*
112
** selectserver.c -- program chatting sederhana menggunakan
stream socket
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(void)
{
fd_set master; // master file descriptor
list
fd_set read_fds; // temp file descriptor
list utk select()
struct sockaddr_in myaddr; // alamat IP server
struct sockaddr_in remoteaddr; // alamat IP client
int fdmax; // jumlah maximum file
descriptor
int listener; // listening socket
descriptor
int newfd; // socket descriptor yg baru
diterima
char buf[256]; // buffer for client data
int nbytes;
int yes=1;
int addrlen;
int i, j;
113
// socket() system call dgn argumen 1. domain 2. jenis
socket 3. protokol
// socket() menghasilkan nilai socket descriptor,
// jika nilai return = -1, berarti terjadi error
exit(1);
}
114
// jumlah koneksi dibatasi 10
printf("Memanggil listen system call untuk menunggu
permintaan koneksi dari client \n");
if (listen(listener, 10) == -1) {
perror("listen");
exit(1);
}
// LOOP utama
for(;;) {
read_fds = master; // simpan data ke
variabel lain
// memanggil system call select()
// menunggu ada sinyal koneksi dari client
// select() : memonitor banyak socket secara
bersamaan
if (select(fdmax+1, &read_fds, NULL, NULL, NULL) ==
-1) {
perror("select");
exit(1);
}
115
// accept system call digunakan untuk menghandle
// adanya sinyal permintaan koneksi dari client
&addrlen)) == -1) {
perror("accept");
} else {
FD_SET(newfd, &master); //
menambahkan ke master set
if (newfd > fdmax) { //
menyimpan jumlah yg terhubung
fdmax = newfd;
}
printf("Ada koneksi baru dari mesin
dengan IP address %s "
"nomer socket %d\n",
inet_ntoa(remoteaddr.sin_addr), newfd);
}
} else {
// meng-handle data dari client
// menerima sinyal yg masuk dengan perintah recv
system call
if ((nbytes = recv(i, buf, sizeof(buf),
0)) <= 0) {
// ada error atau koneksi diputus
oleh client
if (nbytes == 0) {
// koneksi terputus
printf("socket no %d
terputus\n", i);
} else {
perror("recv");
}
close(i); // bye
FD_CLR(i, &master); // client yg
terputus dihapus dari master set
} else {
// membaca data dari client
for(j = 0; j <= fdmax; j++) {
116
// mengirimkan ke semua client
menggunakan send() system call
if (FD_ISSET(j, &master)) {
// kecuali server atau diri
sendiri
if (j != listener && j !=
i) {
if (send(j, buf, nbytes,
0) == -1) {
perror("send");
}
}
}
}
}
}
}
}
}
return 0;
}
2. Berikan komentar tiap baris pada program tersebut apa maksud dan
kegunaan perintah diatas bila dihubungkan dengan stream socket
3. Dengan memakai concurrent server, buatlah program yang bisa menerima
permintaan dari beberapa client berupa permintaan untuk menampilkan
tanggal dan jam server di client (di client memasukkan perintah date/time
maka server akan mengirim bali tanggal/jam server sekarang dan client
menampilkan apa yang diterima di server tersebut).
117
VI. Laporan Resmi
Tugas Pendahuluan :
Hasil percobaan :
Daftar Pertanyaan
Berikan kesimpulan praktikum yang anda lakukan.
Selain dua tipe penerimaan koneksi pada stream socket : iteratif server dan
concurent server dikenal pula folking server. Jelaskan secara singkat apa itu
folking server dan apa perbedaan dengan iteratif dan concurent.
118