TCP (Transfer Control Protocol) SOCKET PROGRAMMING
TCP menyediakan layanan transfer yang dapat diandalkan dengan mengirimkan paket datagrams per kelompok antar server dan client dengan pemeriksaan.
Keuntungan TCP: -
Mampu menangani paket yang hilang
-
Mampu menangani kedatangan paket ganda.
-
Dapat mengatasi penerimaan paket secara beriringan.
-
Menyediakan alur penerimaan paket.
-
Data yang diterima dapat diepercaya dan diandalkan.
Kelemahan TCP : -
Waktu lebih lama.
-
Paket yang dikirim besar.
Fungsi socket protocol TCP 1.
socket(AF_INET, SOCK_STREAM, 0), berfungsi untuk membuat socket dan parameter family yang digunakan adalah AF_INET yaitu internet protocol dan socket yang digunakan adalah SOCK_STREAM yang berfungsi untuk membuka socket pada TCP.
2.
htonl(), meng-convert unsigned integer ke network byte order.
3.
inet_ntoa(), ntoa singkatan 'network to ascii', nilai return-nya berupa string dari alamat yang dilewatkan.
4.
inet_addr(), meng-convert string menjadi network byte order.
5.
bind(), digunakan pada pihak server, untuk membuka 'port' komunikasi.
6.
write(), send(), bertugas mengirimkan data.
7.
read(), recv(), bertugas menerima data.
8.
connect(), digunakan pada pihak client, untuk mengadakan koneksi ke server.
9.
listen(), menunggu koneksi socket.
10. accept(), menerima koneksi socket. 11. close() dan shutdown(), digunakan untuk menutup atau mengakhiri koneksi.
Pemrograman Jaringan – TCP Socket Programming
1
Diagram Alur Socket Programming dengan UDP
Pemrograman Jaringan – TCP Socket Programming
2
Program TCP Socket dengan Bahasa C Listing TCPServer.c: /* TCPserver.c */ #include #include #include #include #include #include #include
<stdio.h> <string.h>
<signal.h> <sys/types.h> <sys/socket.h>
#define KONEKSI_MAKSIMAL 10 int main (int argc, char *argv[]) { struct sockaddr_in alamat_serv; struct sockaddr_in alamat_clie; unsigned no_port; int socketfd; if (argc != 2) { fprintf (stderr, "gunakan: %s <nomor_port>\n", argv[0]); exit(1); } no_port = atoi (argv[1]); socketfd = socket (AF_INET, SOCK_STREAM, 0); /* untuk membersihkan child process, yang telah selesai */ signal(SIGCHLD, SIG_IGN); /* kita reset terlebih dahulu variable alamat_serv */ bzero (&alamat_serv, sizeof(alamat_serv)); alamat_serv.sin_family = AF_INET; alamat_serv.sin_port = htons (no_port); /* macro INADDR_ANY menghasilkan current ip */ alamat_serv.sin_addr.s_addr = htonl (INADDR_ANY); /* buka port */ if (bind (socketfd, (struct sockaddr *)&alamat_serv, sizeof (struct sockaddr)) < 0) { fprintf (stderr, "maaf ya, tidak bisa memasang port !\n"); exit(1); } printf ("serverteman menunggu teman datang ...\n"); /* menuggu koneksi yang masuk, * koneksi maksimal dilayani sebanyak KONEKSI_MAKSIMAL */
Pemrograman Jaringan – TCP Socket Programming
3
listen (socketfd, KONEKSI_MAKSIMAL); while(1) { int client_size = sizeof (struct sockaddr_in); int newfd; /* menerima koneksi yang datang */ newfd =accept (socketfd, (struct sockaddr *)&alamat_clie, &client_size); if(newfd == -1) { perror ("accept"); /* jika terjadi error akan looping lagi */ continue; } /* mengetahui siapa yang mengadakan koneksi */ printf("Teman dari %s telah datang\n", inet_ntoa (alamat_clie.sin_addr)); /* fork mengasilkan nilai return 0 pada child process, pada parent process, fork() menghasilkan nilai pid dari child yang diciptakan*/ if (!fork ()) { /* child process */ /* peringatan !, variabel buffer hanya menampung 255 karakter */ char buffer[256]; sprintf (buffer, "Halo Teman, selamat datang di Server.Teman\n"); /* kirim pesan */ if (send (newfd, buffer, strlen (buffer), 0) == -1) { perror ("send"); continue; } close (newfd); exit (0); } else /* parent process, disini tidak dibutuhkan newfd, jadi sebaiknya ditutup. parent process akan looping lagi untuk menerima client yang lain*/ close (newfd); } return 0; }
Pemrograman Jaringan – TCP Socket Programming
4
Listing TCPClient.c : /* TCPclient.c */ #include #include #include #include #include #include #include #include
<stdio.h> <string.h> <signal.h> <sys/types.h> <sys/socket.h>
int main (int argc, char *argv[]){ struct sockaddr_in alamat_ku; struct sockaddr_in tujuan; struct hostent *host_server; int socketfd, connect_status, baca; int no_port; char buffer[256]; if (argc != 3) { fprintf (stderr, "gunakan: %s <nomor_port>\n", argv[0]); exit(1); } if ((socketfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { fprintf (stderr, "tidak bisa memasang socket !\n"); exit(1); } if ((host_server = gethostbyname(argv[1])) == NULL) { fprintf (stderr, "Nama host mungkin salah :)\n"); exit(1); } no_port = atoi(argv[2]); bzero (&tujuan, sizeof(tujuan)); tujuan.sin_family = AF_INET; tujuan.sin_port = htons (no_port); memcpy ((char *)&tujuan.sin_addr.s_addr, host_server>h_addr_list[0], host_server->h_length); if ((connect_status = connect (socketfd, (struct sockaddr *)&tujuan, sizeof(tujuan))) < 0) { fprintf(stderr, "%s: tidak dapat melakukan koneksi\n", argv[0]); exit(1); }
Pemrograman Jaringan – TCP Socket Programming
5
while((baca = recv(socketfd, buffer, strlen(buffer), 0)) > 0) { printf("%s", buffer); } close (socketfd); return 0; }
Pemrograman Jaringan – TCP Socket Programming
6
Program TCP Socket dengan Bahasa JAVA Listing TCPEchoServerA.JAVA : //Server that echoes back client's messages. //At end of dialogue, sends message indicating number of //messages received. Uses TCP. import java.io.*; import java.net.*; import java.util.*; public class TCPEchoServerA { private static ServerSocket servSock; private static final int PORT = 1234; public static void main(String[] args) { System.out.println("Opening port...\n"); try { servSock = new ServerSocket(PORT); //Step 1. } catch(IOException ioEx) { System.out.println( "Unable to attach to port!"); System.exit(1); } do { handleClient(); }while (true); } private static void handleClient() { Socket link = null; //Step 2. try { link = servSock.accept(); //Step 2. Scanner input = new Scanner(link.getInputStream());//Step 3. PrintWriter output = new PrintWriter( link.getOutputStream(),true); //Step 3. int numMessages = 0; String message = input.nextLine(); //Step 4. while (!message.equals("***CLOSE***")) { System.out.println("Message received."); numMessages++; output.println("Message " + numMessages + ": " + message); //Step 4. message = input.nextLine(); } output.println(numMessages + " messages received.");//Step 4. }
Pemrograman Jaringan – TCP Socket Programming
7
catch(IOException ioEx) { ioEx.printStackTrace(); } finally { try { System.out.println( "\n* Closing connection... *"); link.close(); //Step 5. } catch(IOException ioEx) { System.out.println( "Unable to disconnect!"); System.exit(1); } } } }
Listing TCPEchoClientA.JAVA : import java.io.*; import java.net.*; import java.util.*; public class TCPEchoClientA { private static InetAddress host; private static final int PORT = 1234; public static void main(String[] args) { try { host = InetAddress.getLocalHost(); } catch(UnknownHostException uhEx) { System.out.println("Host ID not found!"); System.exit(1); } accessServer(); } private static void accessServer() { Socket link = null; //Step 1. try { link = new Socket(host,PORT); //Step 1. Scanner input = new Scanner(link.getInputStream()); //Step 2. PrintWriter output = new PrintWriter( link.getOutputStream(),true); //Step 2. //Set up stream for keyboard entry...
Pemrograman Jaringan – TCP Socket Programming
8
Scanner userEntry = new Scanner(System.in); String message, response; do { System.out.print("Enter message: "); message = userEntry.nextLine(); output.println(message); //Step 3. response = input.nextLine(); //Step 3. System.out.println("\nSERVER> "+response); }while (!message.equals("***CLOSE***")); } catch(IOException ioEx) { ioEx.printStackTrace(); } finally { try { System.out.println( "\n* Closing connection... *"); link.close(); //Step 4. } catch(IOException ioEx) { System.out.println( "Unable to disconnect!"); System.exit(1); } } } }
Pemrograman Jaringan – TCP Socket Programming
9