Anda di halaman 1dari 9

PRAKTIKUM X

SOCKET PROGRAMMING TCP LANJUT

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.

II. Peralatan Yang Dibutuhkan


1. Beberapa komputer yang berfungsi sebagai server.
2. Beberapa komputer yang berfungsi sebagai client.
3. Hub/switch sebagai penghubung jaringan.
4. Kabel jaringan secukupnya.

III. Dasar Teori


Pada praktikum sebelumnya telah dipelajari tentang dasar – dasar
pemprograman socket. Dua type pemprograman socket yang paling utama yaitu
stream socket/TCP dan datagram socket/UDP.

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.

Gambar 11.1 Iterating Server


Meskipun terjadi koneksi dua client tapi yang dilayani adalah client yang
pertama koneksi, setelah koneksi client1 selesai, baru client2 bisa dilayani.
Sementara server melayani koneksi client1 maka koneksi yang lain diblok.
Dasar flow pada iterating server bisa dilihat pada gambar 11.2.

Gambar 11.2 Dasar flow pada 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.

Gambar 11.3 Concurrent Server

Untuk melakukan monitor terhadap banyak socket secara bersamaan maka


diperlukan prosedure select().
Pada percobaan praktikum kali ini kita mencoba membuat program concurrent
server.

IV. Tugas Pendahuluan


1. Jelaskan prinsip kerja socket programming untuk komunikasi dua arah
2. Jelaskan perbedaan TCP dan UDP

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>

#define PORT 8888 // nomer port yg dipilih

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;

FD_ZERO(&master); // master dan temp


diberi nilai 0
FD_ZERO(&read_fds);

// socket () system call digunakan utk inisialisasi socket

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

printf("Memanggil socket system call untuk inisialisasi


socket.... \n");
if ((listener = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
printf("inisialisasi socket gagal...ada error...\n");

exit(1);
}

// setsockopt digunakan utk mengambil/mengeset option utk


socket
if (setsockopt(listener, SOL_SOCKET, SO_REUSEADDR, &yes,
sizeof(int)) == -1) {
perror("setsockopt");
exit(1);
}

// memanggil bind system call untuk memberi nomor port ke


socket
//

printf("Memanggil bind system call untuk inisialisasi nomer


port ke socket...\n");
myaddr.sin_family = AF_INET;
myaddr.sin_addr.s_addr = INADDR_ANY;
myaddr.sin_port = htons(PORT); // host to
network short; mengubah big endian
memset(&(myaddr.sin_zero), '\0', 8); // ke little endian
if (bind(listener, (struct sockaddr *)&myaddr,
sizeof(myaddr)) == -1) {
perror("bind");
exit(1);
}

// memanggil listen system call


// listen berfungsi untuk mendeteksi adanya sinyal
permintaan koneksi ke server

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);
}

// menambah listerner ke master set


FD_SET(listener, &master);

// mengacu ke nilai file descriptor tertinggi


fdmax = listener; // fdmax baru berisi 1

printf("Server sudah aktif, ketik perintah <telnet no_ip


no_port> \n");
printf("Nomer port yg digunakan adalah %d \n",PORT);

// 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);
}

// membaca semua data pada semua client yg sudah


terhubung
for(i = 0; i <= fdmax; i++) {
if (FD_ISSET(i, &read_fds)) { // ada 1 lagi
yang masuk
if (i == listener) {
// menghandle koneksi yg baru masuk
addrlen = sizeof(remoteaddr);

115
// accept system call digunakan untuk menghandle
// adanya sinyal permintaan koneksi dari client

if ((newfd = accept(listener, (struct


sockaddr *)&remoteaddr,

&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

FORMAT LAPORAN RESMI


Nama dan NRP mahasiswa

Judul Percobaan : Socket Programming TCP Lanjut


Dasar Teori :

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

Anda mungkin juga menyukai