Anda di halaman 1dari 44

PENGENALAN 

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 ()

NO Mengirim atau NO Mengirim atau


Menerima Data Menerima Data

BAGIAN PENGIRIMAN DAN


PENERIMAAN DATA

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;

// variable onlu on server


  SOCKET m_sAcceptSocket; 

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

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

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;

iByte = recv(m_sSocket, temp, 4096, 0);


if (iByte > 0)
{
temp[iByte] = '\0';
cout << ":: " << temp << endl;

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;

int iStat = send (m_sSocket, cData, strlen(cData)+1, 0);


if (iStat <= 0 )
{
cout << "Error on sending" << endl;
WSACleanup();
return;
}
 
Listing program di bawah ini hanya digunakan untuk koneksi dengan 
protokol UDP. 
 
char temp[4096];
int iByte;
sockaddr_in mSenderAddress;
int mSenderAddressSize = sizeof(mSenderAddress);

iByte = recvfrom(m_sSocket, temp, 4096, 0, (SOCKADDR *) &mSenderAddress,


&mSenderAddressSize);
if (iByte > 0)
{
temp[iByte] = '\0';
cout << mSenderAddress.sin_addr.s_addr << " ";
cout << mSenderAddress.sin_port << " ";
cout << ":: " << temp << endl;
}

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>

using namespace std;

CServerApp m_cServerApp;
HANDLE handleThread1;

void ReceiveThread(void *vPar);

int main( void )


{
// declaring variables
char cBuf[4096];
m_cServerApp.m_iStatusConnect = 1;

// starting the server


m_cServerApp.vStartServer();

// waiting client
m_cServerApp.vWaitClient();
cout << "Client connected ..." << endl;

// running thread for read


_beginthread(ReceiveThread, 0, NULL);

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

void ReceiveThread(void *vPar)


{
while (m_cServerApp.m_iStatusConnect != 0)
{
m_cServerApp.iReceiveData();
}
}
 
Listing file “ServerApp.cpp”  
// =======================================================
// Sample code for studying TCP/IP.
// This code is used as server side on communication.
// created by Reza Darmakusuma.
// =======================================================

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

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

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

int CServerApp::iSendData(char* cData)


{
int iStat = send (m_sAcceptSocket, cData, strlen(cData)+1, 0);
if (iStat <= 0 )
cout << "Error on sending" << endl;

return 0;
}

int CServerApp::iReceiveData()

23
{
char temp[4096];
int iByte;

iByte = recv(m_sAcceptSocket, temp, 4096, 0);


if (iByte > 0)
{
temp[iByte] = '\0';
cout << ":: " << temp << endl;
}

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>

using namespace std;

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>

using namespace std;

CClientApp m_cClientApp;
HANDLE handleThread1;

void ReceiveThread(void *vPar);

int main()
{
char cBuf[4096];
m_cClientApp.m_iStatusConnect = 1;

// create socket
m_cClientApp.vStartClient();

// connect to server
m_cClientApp.vConnectServer();

// starting receive thread


handleThread1 = GetStdHandle(STD_OUTPUT_HANDLE);
_beginthread(ReceiveThread, 0, NULL);

// starting send thread


while (TRUE)

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

void ReceiveThread(void *vPar)


{
while (m_cClientApp.m_iStatusConnect != 0)
{
m_cClientApp.iReceiveData();
}

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

int CClientApp::iSendData(char* cData)


{
int iStat = send (m_sSocket, cData, strlen(cData)+1, 0);
if (iStat <= 0 )
cout << "Error on sending" << endl;

return 0;
}

int CClientApp::iReceiveData()
{
char temp[4096];
int iByte;

iByte = recv(m_sSocket, temp, 4096, 0);


if (iByte > 0)
{
temp[iByte] = '\0';
cout << ":: " << temp << endl;
}

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>

using namespace std;

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>

using namespace std;

CServerApp m_cServerApp;

int main( void )


{

// starting the server


m_cServerApp.vStartServer();

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

cout << "Connection Ended ..." << endl;


// ---------------------------------------------------------------------
// close socket
m_cServerApp.vCloseServer();
return 0;
}
 
Listing file “ServerApp.cpp”  
// =======================================================
// Sample code for studying TCP/IP.
// This code is used as server side on communication.
// created by Reza Darmakusuma.
// =======================================================

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

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

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

int CServerApp::sendData(char *sendbuf)


{
return send(m_sAcceptSocket, sendbuf, strlen(sendbuf), 0 );
}

int CServerApp::recvData(char *recvbuf,int size)


{
int sz = recv(m_sAcceptSocket, recvbuf, size, 0 );
recvbuf[sz] = '\0';
return sz;
}

void CServerApp::fileReceive(char *filename)


{
char rec[50] = "";

recv( m_sAcceptSocket, filename, 32, 0 );


send( m_sAcceptSocket, "OK", strlen("OK"), 0 );

FILE *fw = fopen(filename, "w");

int recs = recv( m_sAcceptSocket, rec, 32, 0 );


send( m_sAcceptSocket, "OK", strlen("OK"), 0 );

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>

using namespace std;

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>

using namespace std;


CClientApp m_cClientApp;

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

int CClientApp::sendData(char *sendbuf)


{
return send(m_sSocket, sendbuf, strlen(sendbuf), 0 );
}

int CClientApp::recvData(char *recvbuf,int size)


{
int sz = recv(m_sSocket, recvbuf, size, 0 );
recvbuf[sz] = '\0';
return sz;
}

void CClientApp::fileSend(char *fpath)


{

// Extract only filename from given path.


char filename[50];
int i=strlen(fpath);
for(;i>0;i--)if(fpath[i-1]=='\\')break;
for(int j=0;i<=(int)strlen(fpath);i++)filename[j++]=fpath[i];
////////////////////////////////////////

ifstream myFile (filename, ios::in|ios::binary|ios::ate);


int size = (int)myFile.tellg();
myFile.close();

char filesize[10];itoa(size,filesize,10);

send( m_sSocket, filename, strlen(filename), 0 );


char rec[32] = "";
recv( m_sSocket, rec, 32, 0 );

send( m_sSocket, filesize, strlen(filesize), 0 );


recv( m_sSocket, rec, 32, 0 );

FILE *fr = fopen(filename, "r");

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>

using namespace std;

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

Anda mungkin juga menyukai