PROTOKOL TCP/IP
Oleh
Pranoto H. Rusmin
Reza Darmakusuma
Nugraha Muthus
TEKNIK ELEKTRO DAN INFORMATIKA
INSTITUT TEKNOLOGI BANDUNG
2010
1
Bab I
Pendahuluan
Teknologi telah berkembang dengan pesat, begitu pula dengan teknologi
komputer. Diawali dengan pengembangan komputer berteknologi transistor
tabung hingga komputer dengan multi‐core, yang meningkatkan kemampuan
dalam melakukan proses dan lain sebagainya. Namun bukan hanya teknologi
tersebut yang berkembang. Komputer sekarang telah dapat berkomunikasi
dengan komputer lain, atau bahkan dengan peralatan lain; baik menggunakan
kabel ataupun nirkabel; untuk melakukan sebuah proses bersama ataupun
melakukan pertukaran data. Proses komunikasi dan pertukaran data antara
satu komputer dengan komputer yang lain ini diperlukan sebuah protokol.
Protokol adalah sebuah aturan yang mengatur terjadinya hubungan,
komunikasi serta perpindahan data antara dua atau lebih komputer.
Implementasi protokol, dapat diterapkan pada perangkat keras, perangkat
lunak atau kombinasi keduanya dengan pertimbangan efektivitas, kehandalan,
dan kemampuan dalam kondisi gagal yang terjadi pada jaringan. Oleh sebab
itu, pada pemodelan OSI (Open System Interconnection) layer, protokol
merupakan bagian penting dalam melakukan pengembangan aplikasi.
Gambar 1. OSI (Open Systems Interconnection) Layer
2
OSI adalah suatu model konseptual yang terdiri atas tujuh layer, yang masing‐
masing layer tersebut mempunyai fungsi yang berbeda. OSI dikembangkan
oleh badan Internasional yaitu ISO (International Organization for
Standardization) pada tahun 1977. Model ini juga dikenal dengan model tujuh
lapis OSI (OSI seven layer model). Berikut adalah penjelasan singkat mengenai
fungsi dan pengertian dari masing‐masing layer.
1. Application layer. Merupakan layer paling tinggi dari model OSI. Seluruh
layer dibawahnya bekerja untuk layer ini. Tugas dari application layer
adalah sebagai antarmuka dengan aplikasi dengan fungsionalitas
jaringan, mengatur bagaimana aplikasi dapat mengakses jaringan, dan
kemudian membuat pesan‐pesan kesalahan. Protokol yang berada dalam
lapisan ini adalah HTTP, FTP, SMTP, NFS.
2. Presentation layer. Berfungsi untuk mentranslasikan data yang hendak
ditransmisikan oleh aplikasi ke dalam format yang dapat ditransmisikan
melalui jaringan. Protokol yang berada dalam level ini adalah perangkat
lunak redirektor (redirector software), seperti layanan Workstation
(dalam windows NT) dan juga Network shell (semacam Virtual network
komputing (VNC) atau Remote Dekstop Protokol (RDP).
3. Session layer. Berfungsi untuk mendefinisikan bagaimana koneksi dapat
dibuat, dipelihara, atau dihancurkan. Selain itu, di level ini juga dilakukan
resolusi nama.
4. Transport layer. Berfungsi untuk memecah data ke dalam paket‐paket
data serta memberikan nomor urut ke paket‐paket tersebut sehingga
dapat disusun kembali pada sisi tujuan setelah diterima. Selain itu, pada
level ini juga membuat sebuah tanda bahwa paket diterima dengan
sukses (acknowledgement), dan mentransmisikan ulang terhadap paket‐
paket yang hilang di tengah jalan.
5. Network layer. Berfungsi untuk mendefinisikan alamat‐alamat IP,
membuat header untuk paket‐paket, dan kemudian melakukan routing
melalui internetworking dengan menggunakan router dan switch layer3.
3
6. Data Link layer. Befungsi untuk menentukan bagaimana bit‐bit data
dikelompokkan menjadi format yang disebut sebagai frame. Selain itu,
pada level ini terjadi koreksi kesalahan, flow control, pengalamatan
perangkat keras seperti halnya Media Access Control Address (MAC
Address), dan menetukan bagaimana perangkat‐perangkat jaringan
seperti hub, bridge, repeater, dan switch layer2 beroperasi. Spesifikasi
IEEE 802, membagi level ini menjadi dua level anak, yaitu lapisan Logical
Link Control (LLC) dan lapisan Media Access Control (MAC).
7. Physical layer. Merupakan layer paling bawah dalam model OSI.
Berfungsi untuk mendefinisikan media transmisi jaringan, metode
pensinyalan, sinkronisasi bit, arsitektur jaringan (seperti halnya Ethernet
atau Token Ring), topologi jaringan dan pengabelan. Selain itu, level ini
juga mendefinisikan bagaimana Network Interface Card (NIC) dapat
berinteraksi dengan media kabel atau radio.
Bagaimana dengan protokol TCP/IP? Untuk protokol TCP/IP terdapat 5 layer
yang mengacu pada layer‐layer di atas. Berikut ini adalah layer‐layer pada
protokol TCP/IP.
1. Application layer, Layer ini mendefinisikan aplikasi‐aplikasi network yang
generic atau service yang dapat didukung oleh internet. Sebagai contoh
adalah aplikasi sebagai berikut: Web dengan protokol HTTP, email dengan
protokol SMTP dan file transfer menggunakan protokol FTP.
2. Transmission Control Protocol (TCP) layer, Layer ini menitikberatkan pada
bagaimana data dapat terkirim melalui network.
3. Internet Protocol (IP) layer, Layer ini menangani alamat network dan
routing network.
4. Local Network Access Protocol (NAP) layer, Layer ini merupakan bagian
dari sitem yang menitikberatkan pada bagaimana dapat berkomunikasi
dengan jaringan lokal, apakah itu dengan ethernet ataupun token ring.
5. Physical layer, Layer ini menjelaskan koneksi secara fisik bagaimana
sebuah sistem dapat berkomunikasi, baik menggunakan Network Ethernet
Card (NIC) atau dengan modem untuk melakukan koneksi dengan jaringan
4
lokal. Perbandingan dengan OSI layer, physical layer pada TCP/IP protokol
merupakan gabungan dari phisical layer dan data link layer pada OSI layer.
Pembahasan yang akan dilakukan pada tutorial ini dititikberatkan pada
pembahasan sederhana mengenai protokol TCP/IP yang terletak pada
transport layer, dengan sedikit pembahasan UDP/IP sehingga terlihat
perbedaan antara kedua protokol tersebut.
Pada tutorial ini juga dilegkapi dengan beberapa contoh yang dipergunakan
untuk mendukung pemahaman konsep dan aplikasinya. Oleh sebab itu,berikut
ini adalah kebutuhan yang diperlukan untuk pengembangan aplikasi tersebut:
1. Microsoft Windows XP Service Pack 3
2. Visual Studio 2008 Express Edition
3. Windows SDK
5
Bab II
Socket, User Data Protocol (UDP), Transmission Control
Protocol (TCP)
Pada masa sekarang, kolaborasi antar peralatan bukanlah hal yang sulit seperti
halnya melakukan komunikasi data melalui jaringan. Sebagai contoh adalah
game‐game yang berkembang pada masyarakat, yaitu multiplayer game
Ragnarok, Counter Strike, Battle Field dan lain sebagainya. Pada game‐game
multiplayer yang ada, beberapa diantaranya menggunakan protokol UDP
dalam melakukan koneksi dengan server, ataupun protokol TCP yang
merupakan bagian dari socket.
Soket merupakan fasilitas IPC (Inter Proses Communication) untuk aplikasi
jaringan. Agar suatu soket dapat berkomunikasi dengan soket lainnyanya,
maka soket butuh diberi suatu alamat unik sebagai identifikasi.
Gambar 2. Model IPC dengan soket
Secara analogi, IP dan Port komputer diibaratkan sebagai sebuah telepon
suatu perusahaan dengan nomor ekstensi tertentu. Sebagai contoh apabila
kita hendak berkomunikasi dengan Bapak Pranoto di Laboratorium Sistem
6
Kendali dan Komputer (LSKK), Institut Teknologi Bandung, Bandung. Berawal
dengan melakukan koneksi pada alamat telepon dengan nomor 022‐2500960,
kemudian melakukan koneksi ke ekstensi 272. Apabila telpon tersebut
diterima, maka kita dapat berkomunikasi dengan Bp Pranoto.
Hal yang sama juga terjadi pada komunikasi antar komputer melalui protokol
TCP/IP melalui soket. Alamat soket terdiri atas Alamat IP dan Port. Contoh
alamat soket adalah 192.168.0.88. Sedangkan contoh alamat port seperti
8000, 8001, 8080 yang sering digunakan sebagai alamat HTTP, 8007 yang
sering dipergunakan sebagai alamat port pada protocol Apache JServ, dan lain
sebagainya.
Protokol Komunikasi Soket
Terdapat dua macam protokol komunikasi yang digunakan pada soket. Kedua
protokol ini terletak pada transport layer. Protokol tersebut adalah User
Datagram Protocol (UDP ) dan Transmission Control Protocol (TCP). Berikut ini
adalah penjelasan dari masing‐masing protokol.
A. User Datagram Protocol (UDP)
UDP merupakan salah satu OSI transport layer sederhana yang
dipergunakan pada aplikasi jaringan client/server. Protokol ini bersifat
tanpa koneksi atau dengan kata lain untuk melakukan komunikasi, antara
client dan server tidak perlu terkoneksi. Oleh sebab itu, UDP bergantung
pada application layer dan services untuk reliabilitasnya. Pemanfaatan
protokol ini biasanya diterapkan pada aplikasi video conference atau
computer games.
UDP terbentuk menggunakan format datagram yang terdiri dari sebuah
unit pesan (8‐bytes pertama berisi informasi header dan data berikutnya
merupakan data). Header pada UDP datagram terdiri dari 4 bagian yang
masing‐masing terdiri dari 2 byte. Bagian tersebut adalah:
1. Source port, adalah alamat komputer pengirim data
2. Destination port, adalah alamat komputer penerima data
3. Datagram size, adalah jumlah data yang dikirimkan dari komputer
pengirim kepada komputer penerima.
4. Checksum, adalah kalkulasi 16‐bit data yang menggunakan metode
one’s complement dari penjumlahan one’s complement data yang
7
berasal dari IP header, UDP header dan beberapa data yang
dimanfaatkan untuk mendeteksi kesalahan data yang terkirim.
5. Data, adalah data yang hendak dikirim.
Gambar 3 adalah struktur frame dari protokol UDP yang menjelaskan
format datagram dalam pengiriman data.
Gambar 3. Frame data protokol UDP
B. Transmission Control Protocol (TCP)
Protokol TCP memerlukan koneksi antara komputer pengirim dan
komputer penerima sebelum terjadi pengiriman data. Beberapa aplikasi
yang menggunakan protokol ini adalah internet, SMTP, POP3, FTP. Gambar
berikut adalah struktur frame dari protokol TCP yang dipergunakan dalam
koneksi dan pengiriman data. Gambar 4 adalah struktur frame dari
protokol TCP yang menjelaskan format datagram dalam pengiriman data.
Gambar 4. Frame data protokol TCP
8
Berikut ini adalah penjelasan dari masing masing format datagram di atas.
1. Source port, adalah alamat komputer pengirim data.
2. Destination port, adalah alamat komputer penerima data.
3. Sequence number, yang dipergunakan untuk mekanisme
acknowledgement.
4. Acknowledgement number,
5. Data offset, yang dipergunakan untuk menentukan jumlah header data
yang hendak dikirim.
6. Reserved, belum dipergunakan.
7. ECN dan Control bits, dipergunakan untuk menentukan mekanisme
pengontrolan komunikasi.
8. Window, dipergunakan untuk menentukan data yang hendak diterima.
9. Checksum, dipergunakan untuk pengecekan kesalahan data.
10. Urgent pointer, yang dipergunakan untuk menentukan byte data yang
penting.
11. Option, dipergunakan untuk menambahkan beberapa option dalam
pengiriman data, seperti maximum segment size, window scale, dan
lain sebagainya.
12. Padding, dipergunakan untuk memastikan bahwa data yang terkirim
memiliki panjang 32 bit.
13. Data, adalah data yang hendak dikirim.
Model Aplikasi Client‐Server
Pada bagian ini akan dibahas mengenai model flowchat untuk melakukan
komunikasi client‐server yang menggunakan protokol TCP dan UDP.
Seperti yang telah didiskripsikan sebelumnya, protokol TCP membutuhkan
koneksi antara client dan server untuk dapat melakukan komunikasi. Berbeda
halnya dengan protokol UDP yang tidak memerlukan koneksi untuk melakukan
komunikasi data. Berikut ini adalah langkah‐langkah dalam melakukan koneksi
soket yang menggunakan protokol TCP dan UDP:
A. Bagian Server
1. Pada tahap awal, aplikasi diberikan sebuah alamat IP dengan port
tertentu. Sebagai contoh aplikasi server diberikan alamat IP
127.0.0.1 atau yang sering disebut dengan localhost dan
memanfaatkan port 8080 yang sering digunakan untuk HTTP
9
2. Aplikasi menjalankan fungsi listen. Hal ini diperlukan untuk
menunggu aplikasi (client) lain yang hendak melakukan koneksi
dengan server yang menggunakan protokol TCP. Berbeda halnya
dengan aplikasi server yang menggunakan protokol UDP, fungsi ini
tidak diperlukan.
3. Aplikasi menerima koneksi client. Hal ini dapat dilakukan dengan
menjalankan fungsi accept pada aplikasi server yang menggunakan
protokol TCP. Berbeda halnya dengan aplikasi server yang
menggunakan protokol UDP, fungsi ini tidak diperlukan.
4. Aplikasi dapat melakukan komunikasi data dengan client.
Komunikasi ini dilakukan dengan menggunakan fungsi send (TCP)
atau sendto (UDP) untuk mengirim data dan fungsi recv (TCP) atau
recvfrom (UDP) untuk menerima data.
5. Aplikasi server memutuskan hubungan terhadap client.
Pemutusan ini dapat dilakukan apabila aplikasi tidak diperlukan lagi.
Fungsi closesocket digunakan untuk keperluan ini.
B. Bagian Client
1. Pada tahap awal, aplikasi diberikan sebuah alamat IP dengan port
tertentu. Sebagai contoh aplikasi client diberikan alamat IP
127.0.0.1 atau yang sering disebut dengan localhost. Untuk
melakukan koneksi terhadap server, port antara client dan server
harus sama, sebagai contoh port 8080 seperti di atas.
2. Aplikasi melakukan koneksi ke server. Hal ini dapat dilakukan
dengan menjalankan fungsi connect pada aplikasi client yang
menggunakan protokol TCP. Sedangkan pada client yang
menggunakan protokol UDP, tidak diperlukan koneksi ke server.
3. Aplikasi dapat melakukan komunikasi data dengan client,
permintaan koneksi dari client kepada server telah diterima.
Komunikasi ini dilakukan dengan menggunakan fungsi send (TCP)
atau sendto (UDP) untuk mengirim data dan fungsi recv (TCP) atau
recvfrom (UDP) untuk menerima data.
4. Aplikasi client memutuskan hubungan terhadap client. Pemutusan
ini dapat dilakukan apabila aplikasi tidak diperlukan lagi. Fungsi
closesocket digunakan untuk keperluan ini.
10
Gambar 5 adalah flowchart pengiriman data untuk protokol TCP/IP yang
berawal dari koneksi antara client dan server hingga pengiriman dan
penerimaan data.
FLOW BAGIAN SERVER FLOW BAGIAN CLIENT
START START
Membuat IP Mengatur IP
ADDRESS and ADDRESS and
PORT PORT
NO
Listen ()
BAGIAN PENYAMBUNGAN
KONEKSI SERVER-CLIENT
MENGGUNAKAN TCP NO
Permintaan
Minta koneksi ke
koneksi dari
SERVER
CLIENT?
YES
Apakah
Accept () koneksi dapat
diterima?
YES
Connected ()
Selesai? Selesai?
YES YES
BAGIAN PEMUTUSAN
Close () Close ()
KONEKSI
END END
Gambar 5. Flowchart pemrograman dan koneksi socket dengan protokol TCP
Lalu bagaimana dengan diagram alir untuk komunikasi data yang menggunkan protokol UDP?
Pada Gambar 6 diperlihatkan flowchart atau diagram alir untuk pemrograman dan koneksi
socket menggunakan protokol UDP. Dapat dilihat pada gambar bahwa pada protokol UDP,
server tidak melakukan listen yang diperlukan untuk melakukan koneksi dengan client, begitu
pula yang terjadi pada client. Pada bab selanjutkan akan dilakukan implementasi dari flow
tersebut ke melalui program c++.
11
Gambar 6. Flowchart pemrograman dan koneksi socket dengan protokol UDP
12
Bab III
Pendahuluan Pemrograman Socket
Pada bagian ini, akan diberikan langkah‐langkah dalam melakukan
pemrograman socket menggunakan pada environment Microsoft Windows.
Pemrograman ini menggunakan bahasa C++ dengan IDE Visual Studio C++
2008 Express Edition. Oleh sebab itu, bagian ini akan diawali dengan
penggunaan dan pengaturan Visual Studio 2008. Berikut ini adalah langkah‐
langkah yang diperlukan untuk mengatur IDE Visual Studio sebelum
dipergunakan.
A. Pengaturan Visual Studio C++ 2008
1. Membuka Visual Studio C++ 2008
13
2. Pilih Win32 Console Application
• Isi “Name” untuk memberikan nama aplikasi yang hendak dibuat.
• Isi “Location” untuk menembatkan aplikasi yang hendak dibuat.
• Pencet tombol “OK”.
3. Pada Win32 Application Wizard pilih Next
14
• Pilih “Console Application”.
• Check “Empty project”.
• Pencet tombol “Finish”.
4. Masukkan library “ws2_32.lib” pada project
• Pilih menu “Project”
• Pilih menu “Properties” atau Alt+F7
• Masukkan library “ws2_32.lib” pada linker
5. Beberapa header yang diperlukan dalam pemrograman ini adalah
• “iostream.h”
• “stdio.h”
• “conio.h”
• “winsock2.h”
B. Bagian‐Bagian Pemrograman Soket
Sebelum melakukan pemrograman, beberapa variabel disiapkan pada
aplikasi ini. Berikut ini adalah beberapa varibel yang perlu dideklarasikan.
// variable on server and client
WSADATA wsaData;
SOCKET m_sSocket;
sockaddr_in m_con;
15
Berikut ini adalah beberapa listing dalam fungsi yang diperlukan untuk
melakukan koneksi melalui soket.
1. Menyiapkan socket
Berikut ini adalah listing program untuk mempersiapkan soket dengan
alamat, port dan sebagainya yang menggunakan protokol TCP.
Listing ini digunakan pada server ataupun client.
// winsock initialization
int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != NO_ERROR)
{
cout << "Error in winsock initialization" << endl;
WSACleanup();
return;
}
// create socket
m_sSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (m_sSocket == INVALID_SOCKET)
{
cout << "Error in creating socket" << endl;
WSACleanup();
return;
}
Untuk koneksi soket yang menggunakan protokol UDP, maka listing
program yang mengatur tipe soket diganti dengan dengan listing
berikut:
// create socket
m_sSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
2. Menunggu koneksi dengan client
Listing program di bawah ini hanya digunakan untuk koneksi dengan
protokol TCP.
16
// listen socket
if ( listen(m_sSocket, SOMAXCONN) == SOCKET_ERROR )
{
cout << "Failed to listen the socket" << endl;
WSACleanup();
return;
}
// display
cout << "Server is listening ..." << endl;
3. Melakukan koneksi ke server
Listing program di bawah ini hanya digunakan untuk koneksi dengan
protokol TCP.
// connect to server
if (connect( m_sSocket,(SOCKADDR*)&m_con, sizeof(m_con))== SOCKET_ERROR)
{
printf( "Failed to connect.\n" );
WSACleanup();
return;
}
// display
cout << "Client is connected ..." << endl;
Listing ini digunakan untuk melakukan koneksi dengan protokol UDP,
serta melakukan attachment properti dati port ke socket.
// binding process
if (bind( m_sSocket, (SOCKADDR*)&m_con, sizeof(m_con))==SOCKET_ERROR)
{
cout << "Failed to bind the socket" << endl;
WSACleanup();
return;
}
4. Menerima data
Listing program di bawah ini hanya digunakan untuk koneksi dengan
protokol TCP.
char temp[4096];
int iByte;
17
Listing program di bawah ini hanya digunakan untuk koneksi dengan
protokol UDP.
int iStat = sendto(m_sSocket, cData, strlen(cData)+1, 0,
(SOCKADDR*)&mSenderAddress, sizeof(mSenderAddress));
if (iStat <= 0 )
cout << "Error on sending" << endl;
return 0;
5. Mengirim data
Listing program di bawah ini hanya digunakan untuk koneksi dengan
protokol TCP.
char* cData;
return 0;
18
6. Menutup soket
closesocket(m_sSocket);
WSACleanup();
Pemanfaatan dan implementasi dari masing‐masing listing program akan
dijabarkan pada bagian berikutnya.
19
Bab IV
Aplikasi Chatting Menggunakan TCP/IP
Pada bagian ini akan dibahas tentang aplikasi dan pemanfaatan listing program
di atas dalam sebuah aplikasi sederhana, dalam hal ini aplikasi untuk chatting.
Mengintegrasikan listing program tersebut bukan lah hal yang rumit. Untuk
keperluan ini, anda perlu untuk menginstal Visual Studio C++ 2008 Express
Edition. Berikut ini adalah langkah‐langkah yang diperlukan untuk membuat
aplikasi chatting.
Pembuatan Aplikasi Server:
1. Buat project baru dan atur Visual Studio C++ 2008 Express Edition
Note: langkah ini telah dijelaskan pada bagian kedua tutorial ini. Dalam hal
ini, nama aplikasi yang dibuat adalah ServerApp.
2. Buat sebuah file header (*.h) dan dua buah file souce (*.cpp). Pada langkah
ini dibuat:
a. File header: ServerApp.h
Langkah:
• Pilih folder “Header Files” pada solution explorer.
• Klik kanan pada mouse hingga muncul menu baru.
• Pilih menu Add Æ New Item ÆHeader File (.h).
• Beri nama file dan tentukan lokasi file tersebut
• Pencet tombol “Add”.
b. File source: ServerApp.cpp dan MainCode.cpp
Langkah:
• Pilih folder “Sources Files” pada solution explorer
• Klik kanan pada mouse hingga muncul menu baru.
• Pilih menu Add Æ New Item ÆC++ File (.cpp).
• Beri nama file dan tentukan lokasi file tersebut.
• Pencet tombol “Add”.
20
Berikut ini adalah ilustrasi dari langkah kedua, apabila berhasil dilakukan
3. Isikan listing program di bawah ini pada file‐file yang sesuai.
Listing file “MainCode.cpp”
// =======================================================
// Sample code for studying TCP/IP.
// This code is used as server side on communication.
// created by Reza Darmakusuma.
// =======================================================
#include "ServerApp.h"
#include <windows.h>
#include <process.h>
CServerApp m_cServerApp;
HANDLE handleThread1;
// waiting client
m_cServerApp.vWaitClient();
cout << "Client connected ..." << endl;
21
// running thread for receive
while( TRUE )
{
cin.getline(cBuf, 4096);
m_cServerApp.m_iStatusConnect = strcmp(cBuf, "exit");
if (m_cServerApp.m_iStatusConnect == 0)
break;
else
m_cServerApp.iSendData(cBuf);
}
// close socket
m_cServerApp.vCloseServer();
CloseHandle(handleThread1);
return 0;
}
#include "ServerApp.h"
CServerApp::CServerApp()
{
CServerApp::~CServerApp()
{
vCloseServer();
}
void CServerApp::vStartServer()
{
// winsock initialization
int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != NO_ERROR)
{
cout << "Error in winsock initialization" << endl;
WSACleanup();
return;
}
22
// create socket
m_sSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (m_sSocket == INVALID_SOCKET)
{
cout << "Error in creating socket" << endl;
WSACleanup();
return;
}
// binding process
if (bind(m_sSocket, (SOCKADDR*)&m_con, sizeof(m_con) )==SOCKET_ERROR )
{
cout << "Failed to bind the socket" << endl;
WSACleanup();
return;
}
// display
cout << "Server is started ..." << endl;
// listen socket
if ( listen(m_sSocket, SOMAXCONN) == SOCKET_ERROR )
{
cout << "Failed to listen the socket" << endl;
WSACleanup();
return;
}
// display
cout << "Server is listening ..." << endl;
}
void CServerApp::vWaitClient()
{
m_sAcceptSocket = INVALID_SOCKET;
while (m_sAcceptSocket == INVALID_SOCKET)
{
m_sAcceptSocket = accept( m_sSocket, NULL, NULL );
}
}
void CServerApp::vCloseServer()
{
closesocket(m_sAcceptSocket);
WSACleanup();
}
return 0;
}
int CServerApp::iReceiveData()
23
{
char temp[4096];
int iByte;
return 0;
}
Listing file “ServerApp.h”
// =======================================================
// Sample code for studying TCP/IP.
// This code is used as server side on communication.
// created by Reza Darmakusuma.
// =======================================================
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <WinSock2.h>
class CServerApp
{
public:
// constructor & destructor
CServerApp();
~CServerApp();
// socket function
void vStartServer();
void vWaitClient();
void vCloseServer();
int iSendData(char* cData);
int iReceiveData();
// socket variables
WSADATA wsaData;
SOCKET m_sSocket;
SOCKET m_sAcceptSocket;
sockaddr_in m_con;
int m_iStatusConnect;
};
4. Build solution dengan menekan tombol F7 atau pilih menu Build ÆBuild
Solution
5. Debug program dengan menekan tombol F5 atau pilih menu Debug Æ
Start Debugging
24
Berikut ini adalah hasil aplikasi yang telah dieksekusi
Pembuatan Aplikasi Client:
1. Buat project baru dan atur Visual Studio C++ 2008 Express Edition
Note: langkah ini telah dijelaskan pada bagian kedua tutorial ini. Dalam hal
ini, nama aplikasi yang dibuat adalah ClientApp.
2. Buat sebuah file header (*.h) dan dua buah file souce (*.cpp). Pada langkah
ini dibuat:
a. File header: ClientApp.h
Langkah:
• Pilih folder “Header Files” pada solution explorer.
• Klik kanan pada mouse hingga muncul menu baru.
• Pilih menu Add Æ New Item ÆHeader File (.h).
• Beri nama file dan tentukan lokasi file tersebut
• Pencet tombol “Add”.
b. File source: ClientApp.cpp dan ClientCode.cpp
Langkah:
• Pilih folder “Sources Files” pada solution explorer
• Klik kanan pada mouse hingga muncul menu baru.
• Pilih menu Add Æ New Item ÆC++ File (.cpp).
• Beri nama file dan tentukan lokasi file tersebut.
• Pencet tombol “Add”.
25
Berikut ini adalah ilustrasi dari langkah kedua, apabila berhasil dilakukan
3. Isikan listing program di bawah ini pada file‐file yang sesuai.
Listing file “MainCode.cpp”
// =======================================================
// Sample code for studying TCP/IP.
// This code is used as client side on communication.
// created by Reza Darmakusuma.
// =======================================================
#include "ClientApp.h"
#include <windows.h>
#include <process.h>
CClientApp m_cClientApp;
HANDLE handleThread1;
int main()
{
char cBuf[4096];
m_cClientApp.m_iStatusConnect = 1;
// create socket
m_cClientApp.vStartClient();
// connect to server
m_cClientApp.vConnectServer();
26
{
cin.getline(cBuf, 4096);
m_cClientApp.m_iStatusConnect = strcmp(cBuf, "exit");
if (m_cClientApp.m_iStatusConnect == 0)
break;
else
m_cClientApp.iSendData(cBuf);
}
// close socket
m_cClientApp.vCloseClient();
CloseHandle(handleThread1);
return 0;
}
}
Listing file “ClientApp.cpp”
// =======================================================
// Sample code for studying TCP/IP.
// This code is used as server side on communication.
// created by Reza Darmakusuma.
// =======================================================
#include "ClientApp.h"
CClientApp::CClientApp()
{
CClientApp::~CClientApp()
{
vCloseClient();
}
void CClientApp::vStartClient()
{
// winsock initialization
int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != NO_ERROR)
{
cout << "Error in winsock initialization" << endl;
WSACleanup();
return;
}
// create socket
m_sSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
27
if (m_sSocket == INVALID_SOCKET)
{
cout << "Error in creating socket" << endl;
WSACleanup();
return;
}
}
void CClientApp::vConnectServer()
{
// creating server: type, ip address and port
m_con.sin_family = AF_INET;
m_con.sin_addr.s_addr = inet_addr( "127.0.0.1" );
m_con.sin_port = htons( 10000 );
// connect to server
if (connect(m_sSocket, (SOCKADDR*)&m_con, sizeof(m_con))== SOCKET_ERROR)
{
printf( "Failed to connect.\n" );
WSACleanup();
return;
}
// display
cout << "Client is connected ..." << endl;
}
void CClientApp::vCloseClient()
{
closesocket(m_sSocket);
WSACleanup();
}
return 0;
}
int CClientApp::iReceiveData()
{
char temp[4096];
int iByte;
return 0;
}
28
Listing file “ClientApp.h”
// =======================================================
// Sample code for studying TCP/IP.
// This code is used as client side on communication.
// created by Reza Darmakusuma.
// =======================================================
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <WinSock2.h>
class CClientApp
{
public:
// constructor & destructor
CClientApp();
~CClientApp();
// socket function
void vStartClient();
void vConnectServer();
void vCloseClient();
int iSendData(char* cData);
int iReceiveData();
// socket variables
WSADATA wsaData;
SOCKET m_sSocket;
SOCKET m_sConnectSocket;
sockaddr_in m_con;
int m_iStatusConnect;
};
4. Build solution dengan menekan tombol F7 atau pilih menu Build ÆBuild
Solution
5. Debug program dengan menekan tombol F5 atau pilih menu Debug Æ
Start Debugging
29
Berikut ini adalah hasil program yang dibuat
Note: Hasil yang terlihat adalah “Failed to connect”. Hal ini disebabkan
karena aplikasi server belum jalan, sehingga alamat tujuan dari aplikasi
client tidak dapat tercapai. Pada tutorial nanti akan dijelaskan
perbedaannya dengan protokol UDP.
Koneksi Client/Server Pada Aplikasi Chatting
Setelah dua buah aplikasi tersebut dibuat, secara tidak langsung aplikasi
chatting telah selesai. Berikut ini adalah langkah‐langkah menjalankan aplikasi
chatting peer‐to‐peer dari aplikasi yang telah dibuat.
1. Jalankan aplikasi server, dalam hal ini ServerApp.exe pada folder “debug”.
2. Jalankan aplikasi client, dalam hal ini ClientApp.exe pada folder “debug”.
3. Aplikasi telah dapat melakukan chatting.
Berikut ini ilustrasi dari langkah‐langkah tersebut
30
Pada gambar dapat dilihat bahwa apabila client dan server telah terkoneksi
akan terdapat acknowledgement “Client is connected” pada client dan “Client
Connected” pada server.
31
Bab V
Aplikasi Pengiriman File Menggunakan Protokol TCP/IP
Pada bagian ini akan dibahas mengenai pingiriman dan penerimaan file pada
jaringan dengan menggunakan protokol TCP.
Pada dasarnya pengiriman file pada jaringan mirip dengan pengiriman data
pada jaringan menggunakan TCP. Perbedaan yang paling utama adalah data
yang dikirim. Pada pengiriman data, bagian client atau server yang mehendak
mengirimkan file, harus membaca data file terlebih dahulu kemudian data
tersebut dikirimkan melalui jaringan ke tempat tujuan client atau server.
Berikut ini adalah langkah‐langkah yang diperlukan untuk membuat aplikasi
pengiriman file.
Pembuatan Aplikasi Server:
1. Buat project baru dan atur Visual Studio C++ 2008 Express Edition
Note: langkah ini telah dijelaskan pada bagian kedua tutorial ini. Dalam hal
ini, nama aplikasi yang dibuat adalah ServerApp.
2. Buat sebuah file header (*.h) dan dua buah file souce (*.cpp). Pada langkah
ini dibuat:
a. File header: ServerApp.h
Langkah:
• Pilih folder “Header Files” pada solution explorer.
• Klik kanan pada mouse hingga muncul menu baru.
• Pilih menu Add Æ New Item ÆHeader File (.h).
• Beri nama file dan tentukan lokasi file tersebut
• Pencet tombol “Add”.
b. File source: ServerApp.cpp dan MainCode.cpp
Langkah:
• Pilih folder “Sources Files” pada solution explorer
• Klik kanan pada mouse hingga muncul menu baru.
• Pilih menu Add Æ New Item ÆC++ File (.cpp).
32
• Beri nama file dan tentukan lokasi file tersebut.
• Pencet tombol “Add”.
Berikut ini adalah ilustrasi dari langkah kedua, apabila berhasil dilakukan
3. Isikan listing program di bawah ini pada file‐file yang sesuai.
Listing file “MainCode.cpp”
// =======================================================
// Sample code for studying TCP/IP.
// This code is used as server side on communication.
// created by Reza Darmakusuma.
// =======================================================
#include "ServerApp.h"
#include <windows.h>
#include <process.h>
CServerApp m_cServerApp;
// waiting client
m_cServerApp.vWaitClient();
cout << "Client connected ..." << endl;
// ---------------------------------------------------------------------
// receiving file
char rec[50] = "";
33
m_cServerApp.recvData(rec,32);
m_cServerApp.sendData("OK");
if(strcmp(rec,"FileSend")==0)
{
char fname[32] ="";
m_cServerApp.fileReceive(fname);
cout << "File Received........." << endl;
}
#include "ServerApp.h"
CServerApp::CServerApp()
{
CServerApp::~CServerApp()
{
vCloseServer();
}
void CServerApp::vStartServer()
{
// winsock initialization
int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != NO_ERROR)
cout << "Error in winsock initialization" << endl;
// create socket
m_sSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (m_sSocket == INVALID_SOCKET)
{
cout << "Error in creating socket" << endl;
WSACleanup();
return;
}
// binding process
if (bind(m_sSocket, (SOCKADDR*)&m_con, sizeof(m_con)) == SOCKET_ERROR )
{
34
cout << "Failed to bind the socket" << endl;
WSACleanup();
return;
}
// display
cout << "Server is started ..." << endl;
// listen socket
if ( listen(m_sSocket, SOMAXCONN) == SOCKET_ERROR )
{
cout << "Failed to listen the socket" << endl;
WSACleanup();
return;
}
// display
cout << "Server is listening ..." << endl;
}
void CServerApp::vWaitClient()
{
m_sAcceptSocket = INVALID_SOCKET;
while (m_sAcceptSocket == INVALID_SOCKET)
{
m_sAcceptSocket = accept( m_sSocket, NULL, NULL );
}
}
void CServerApp::vCloseServer()
{
closesocket(m_sAcceptSocket);
WSACleanup();
}
rec[recs]='\0';
int size = atoi(rec);
35
while(size > 0)
{
char buffer[1030];
if(size>=1024)
{
recv( m_sAcceptSocket, buffer, 1024, 0 );
send( m_sAcceptSocket, "OK", strlen("OK"), 0 );
fwrite(buffer, 1024, 1, fw);
}
else
{
recv( m_sAcceptSocket, buffer, size, 0 );
send( m_sAcceptSocket, "OK", strlen("OK"), 0 );
buffer[size]='\0';
fwrite(buffer, size, 1, fw);
}
size -= 1024;
}
fclose(fw);
}
Listing file “ServerApp.h”
// =======================================================
// Sample code for studying TCP/IP.
// This code is used as server side on communication.
// created by Reza Darmakusuma.
// =======================================================
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <WinSock2.h>
class CServerApp
{
public:
// constructor & destructor
CServerApp();
~CServerApp();
// socket function
void vStartServer();
void vWaitClient();
void vCloseServer();
int sendData(char *sendbuf);
int recvData(char *recvbuf,int size);
void fileReceive(char *filename);
// socket variables
WSADATA wsaData;
SOCKET m_sSocket;
SOCKET m_sAcceptSocket;
sockaddr_in m_con;
};
36
4. Build solution dengan menekan tombol F7 atau pilih menu Build ÆBuild
Solution
5. Debug program dengan menekan tombol F5 atau pilih menu Debug Æ
Start Debugging
Berikut ini adalah hasil aplikasi yang telah dieksekusi
Pembuatan Aplikasi Client:
1. Buat project baru dan atur Visual Studio C++ 2008 Express Edition
Note: langkah ini telah dijelaskan pada bagian kedua tutorial ini. Dalam hal
ini, nama aplikasi yang dibuat adalah ClientApp.
2. Buat sebuah file header (*.h) dan dua buah file souce (*.cpp). Pada langkah
ini dibuat:
a. File header: ClientApp.h
Langkah:
• Pilih folder “Header Files” pada solution explorer.
• Klik kanan pada mouse hingga muncul menu baru.
• Pilih menu Add Æ New Item ÆHeader File (.h).
• Beri nama file dan tentukan lokasi file tersebut
• Pencet tombol “Add”.
b. File source: ClientApp.cpp dan ClientCode.cpp
Langkah:
• Pilih folder “Sources Files” pada solution explorer
37
• Klik kanan pada mouse hingga muncul menu baru.
• Pilih menu Add Æ New Item ÆC++ File (.cpp).
• Beri nama file dan tentukan lokasi file tersebut.
• Pencet tombol “Add”.
Berikut ini adalah ilustrasi dari langkah kedua, apabila berhasil dilakukan
3. Isikan listing program di bawah ini pada file‐file yang sesuai.
Listing file “MainCode.cpp”
// =======================================================
// Sample code for studying TCP/IP.
// This code is used as client side on communication.
// created by Reza Darmakusuma.
// =======================================================
#include "ClientApp.h"
#include <windows.h>
#include <process.h>
#include <fstream>
int main()
{
// declaring variables
m_cClientApp.m_iStatusConnect = 1;
// create socket
m_cClientApp.vStartClient();
// connect to server
m_cClientApp.vConnectServer();
// ---------------------------------------------------------------------
38
// sending file
char rec[32] = "";
m_cClientApp.sendData("FileSend");
m_cClientApp.recvData(rec,32);
m_cClientApp.fileSend("d:\\test.txt");
printf("File Sent.............\n");
// ---------------------------------------------------------------------
// close socket
m_cClientApp.vCloseClient();
return 0;
}
Listing file “ClientApp.cpp”
// =======================================================
// Sample code for studying TCP/IP.
// This code is used as client side on communication.
// created by Reza Darmakusuma.
// =======================================================
#include "ClientApp.h"
#include <fstream>
CClientApp::CClientApp()
{
CClientApp::~CClientApp()
{
vCloseClient();
}
void CClientApp::vStartClient()
{
// winsock initialization
int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != NO_ERROR)
{
cout << "Error in winsock initialization" << endl;
WSACleanup();
return;
}
// create socket
m_sSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (m_sSocket == INVALID_SOCKET)
{
cout << "Error in creating socket" << endl;
WSACleanup();
return;
}
}
void CClientApp::vConnectServer()
{
// creating server: type, ip address and port
m_con.sin_family = AF_INET;
m_con.sin_addr.s_addr = inet_addr( "127.0.0.1" );
m_con.sin_port = htons( 10000 );
39
// connect to server
if ( connect( m_sSocket, (SOCKADDR*) &m_con, sizeof(m_con) ) ==
SOCKET_ERROR) {
printf( "Failed to connect.\n" );
WSACleanup();
return;
}
// display
cout << "Client is connected ..." << endl;
}
void CClientApp::vCloseClient()
{
closesocket(m_sSocket);
WSACleanup();
}
char filesize[10];itoa(size,filesize,10);
while(size > 0)
{
char buffer[1030];
40
if(size>=1024)
{
fread(buffer, 1024, 1, fr);
send( m_sSocket, buffer, 1024, 0 );
recv( m_sSocket, rec, 32, 0 );
}
else
{
fread(buffer, size, 1, fr);
buffer[size]='\0';
send( m_sSocket, buffer, size, 0 );
recv( m_sSocket, rec, 32, 0 );
}
size -= 1024;
}
fclose(fr);
}
Listing file “ClientApp.h”
// =======================================================
// Sample code for studying TCP/IP.
// This code is used as client side on communication.
// created by Reza Darmakusuma.
// =======================================================
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <WinSock2.h>
class CClientApp
{
public:
// constructor & destructor
CClientApp();
~CClientApp();
// socket function
void vStartClient();
void vConnectServer();
void vCloseClient();
int sendData(char *sendbuf);
int recvData(char *recvbuf,int size);
void fileSend(char *fpath);
// socket variables
WSADATA wsaData;
SOCKET m_sSocket;
sockaddr_in m_con;
int m_iStatusConnect;
};
41
4. Build solution dengan menekan tombol F7 atau pilih menu Build ÆBuild
Solution
5. Buatlah file “test.txt” dengan isi angka “12345” pada folder aplikasi yang
dibuat.
6. Debug program dengan menekan tombol F5 atau pilih menu Debug Æ
Start Debugging
Berikut ini adalah hasil program yang dibuat
Note: seperti yang dapat dilihat, hasil menunjukkan “failed to connect” yang
berarti client tidak dapat terkoneksi dengan server. Meskipun telah ada
acknowledgement “file sent” pada kondisi sebenatnya, file belum tersent.
Untuk penjelasan lebih lanjut, dapat ditanyakan ketika pembahasan.
Koneksi Client/Server Pada Aplikasi Pengiriman File
Setelah dua buah aplikasi tersebut dibuat, secara tidak langsung aplikasi
pengiriman file telah selesai. Berikut ini adalah langkah‐langkah menjalankan
aplikasi tersebut secara peer‐to‐peer.
1. Pindahkan aplikasi ServerApp.exe ke drive “C:\”
2. Pindahkan aplikasi ClientApp.exe ke drive “D:\”
3. Pindahkan file “test.txt” ke drive “D:\”
4. Jalankan aplikasi server, dalam hal ini ServerApp.exe pada drive “C:\”,
menggunakan command window
5. Jalankan aplikasi client, dalam hal ini ClientApp.exe padadrive “C:\”,
menggunakan command window
6. Aplikasi telah dapat melakukan pengiriman file.
42
Berikut ini ilustrasi dari langkah‐langkah tersebut
Gambar Drive “C:\” sebelum program ServerApp.exe dijalankan
Gambar Drive “D:\” sebelum program ClientApp.exe dijalankan.
43
Gambar drive”C:\” setelah aplikasi ServerApp.exe dan ClientApp.exe dijalankan
Pada gambar dapat dilihat bahwa apabila client dan server telah terkoneksi
akan terdapat acknowledgement “Client is connected” pada client dan “Client
Connected” pada server. Setelah terjadi koneksi, client aka mengirimkan file
“test.txt” yang terdapat pada drive “D:\” ke drive “C:\” melalui socket
denganprotokol TCP. Hasil ini dapat dilihat pada gambar di atas, dimana pada
drive “C:\” setelah aplikasi dijalankan, terdapat file “test.txt” yang
sebelumnya, ketika aplikasi belum dijalankan tidak ada. Dapat dilihat bahwa isi
file “test.txt” yang terdapat pada drive “D:\” dan drive “C:\” adalah sama.
44