Bab 11 Socket Programming Tcp Lanjut

11
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 110

Transcript of Bab 11 Socket Programming Tcp Lanjut

Page 1: Bab 11 Socket Programming Tcp Lanjut

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

Page 2: Bab 11 Socket Programming Tcp Lanjut

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

Page 3: Bab 11 Socket Programming Tcp Lanjut

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

Page 4: Bab 11 Socket Programming Tcp Lanjut

** 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

Page 5: Bab 11 Socket Programming Tcp Lanjut

// 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

Page 6: Bab 11 Socket Programming Tcp Lanjut

// 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

Page 7: Bab 11 Socket Programming Tcp Lanjut

// 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

Page 8: Bab 11 Socket Programming Tcp Lanjut

// 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

Page 9: Bab 11 Socket Programming Tcp Lanjut

VI. Laporan Resmi

118

Hasil percobaan :

Judul Percobaan : Socket Programming TCP Lanjut

FORMAT LAPORAN RESMINama dan NRP mahasiswa

Dasar Teori :

Tugas Pendahuluan :

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.