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 #include <sys/types.h> #include <sys/socket.h> #include #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); if
(bind(listener,
(struct
// ke little endian 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 \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