Powered By Blogger

Selasa, 10 Juni 2014

Program Stream Socket


Socket adalah mekanisme komunikasi yang memungkinkan terjadinya pertukaran data antar program atau proses baik dalam satu mesin maupun antar mesin. Gaya pemrograman soket sendiri berawal dari sistem Unix BSD yang terkenal dengan kepeloporannya pada bidang penanganan jaringan, sehingga sering disebut BSD Socket.
Sedangkan Socket Stream adalah socket komunikasi full-duplex berbasis aliran (stream) data. Pada model komunikasi Socket Stream, koneksi dua aplikasi harus dalam kondisi tersambung dengan benar untuk dapat bertukar data. Ini dapat dianalogikan seperti komunikasi telepon. Jika sambungan telepon di salah satu titik putus, maka komunikasi tidak dapat terjadi. Koneksi model seperti ini akan menjamin data dapat dipertukarkan dengan baik, namun memiliki kelemahan dalam hal penggunaan jalur data yang relatif besar dan tidak boleh terputus. 

Proses dalam TCP adalah:
11. Untuk melakukan sambungan client server, program serverseharusnya berjalan terlebih dahulu.
  2.  Di sisi server disediakan sebuah socket, yang disebut welcoming socket yang fungsinya untuk mengesan adanya permintaan sambungan daripada client.
33. Di sisi client terdapatnya client socket. Jika ingin menghubungiserver, maka melalui client socket-nya, client membuat sambungan ke welcoming socket milik server, dengan mode three-way handshake.
44. Setelah welcoming socket menerima sambungan daripada client socket, aplikasi server akan membuat sambungan socket di sisiserver. Dengan connection socket ini, client socket dan connection socket berinteraksi antara satu sama lain untuk mengirim dan menerima data.

   Berikut adalah contoh program client server yang menggunakan stream socket dengan bahasa pemrograman C.


Client:
1.  #include <stdio.h>
2.  #include <stdlib.h>
3.  #include <unistd.h>
4.  #include <errno.h>
5.  #include <string.h>
6.  #include <netdb.h>
7.  #include <sys/types.h>
8.  #include <netinet/in.h>
9.  #include <sys/socket.h>
10.  
11. #define PORT 3333
12. #define MAXDATASIZE 100
13.  
14. int main(int argc, char const *argv[])
15. {
16.         int sockfd, numbytes;
17.         char buf[MAXDATASIZE];
18.         struct hostent *he;
19.         struct sockaddr_in their_addr;
20.  
21.         if (argc != 2)
22.         {
23.                 fprintf(stderr, "usage: client hostname\n");
24.                 exit(1);
25.         }
26.  
27.         if ((he=gethostbyname(argv[1])) == NULL)
28.         {
29.                 perror("gethostbyname");
30.                 exit(1);
31.         }
32.  
33.         if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
34.         {
35.                 perror("socket");
36.                 exit(1);
37.         }
38.  
39.         their_addr.sin_family = AF_INET;
40.         their_addr.sin_port = htons(PORT);
41.         their_addr.sin_addr = *((struct in_addr *)he->h_addr);
42.         memset(&(their_addr.sin_zero), '\0', 8);
43.  
44.         if (connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) == -1)
45.         {
46.                 perror("connect");
47.                 exit(1);
48.         }
49.  
50.         if ((numbytes=recv(sockfd, buf, MAXDATASIZE-1, 0)) == -1)
51.         {
52.                 perror("recv");
53.                 exit(1);
54.         }
55.  
56.         buf[numbytes] = '\0';
57.         printf("Received: %s", buf);
58.         close(sockfd);
59.  
60.         return 0;
61. } 

Penjelasan dari client.c:
Pada program tersebut mendeskripsikan client ke server pada hostname:port  tertentu. yang didalamnya terdapat  pembuatan socket yang akan melakukan pengalamatan ke server dan melakukan koneksi  ke server dengan menggunakan perintah connect ().
Server:
1.  #include <stdio.h>
2.  #include <stdlib.h>
3.  #include <unistd.h>
4.  #include <errno.h>
5.  #include <string.h>
6.  #include <sys/types.h>
7.  #include <sys/socket.h>
8.  #include <netinet/in.h>
9.  #include <arpa/inet.h>
10. #include <sys/wait.h>
11. #include <signal.h>
12.  
13. #define MYPORT 3333
14. #define BACKLOG 10
15.  
16. void sigchld_handler(int s)
17. {
18.         while(wait(NULL) > 0);
19. }
20.  
21. int main(void)
22. {
23.         int sockfd, new_fd;
24.         struct sockaddr_in my_addr;
25.         struct sockaddr_in their_addr;
26.         int sin_size;
27.         struct sigaction sa;
28.         int yes=1;
29.  
30.         if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
31.         {
32.                 perror("socket");
33.                 exit(1);
34.         }
35.  
36.         if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1)
37.         {
38.                 perror("setsockopt");
39.                 exit(1);
40.         }
41.  
42.         my_addr.sin_family = AF_INET;
43.         my_addr.sin_port = htons(MYPORT);
44.         my_addr.sin_addr.s_addr = INADDR_ANY;
45.         memset(&(my_addr.sin_zero), '\0', 8);
46.  
47.         if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
48.         {
49.                 perror("bind");
50.                 exit(1);
51.         }
52.  
53.         if (listen(sockfd, BACKLOG) == -1)
54.         {
55.                 perror("listen");
56.                 exit(1);
57.         }
58.  
59.         sa.sa_handler = sigchld_handler;
60.         sigemptyset(&sa.sa_mask);
61.         sa.sa_flags = SA_RESTART;
62.  
63.         if (sigaction(SIGCHLD, &sa, NULL) == -1)
64.         {
65.                 perror("sigaction");
66.                 exit(1);
67.         }
68.  
69.         while(1)
70.         {
71.                 sin_size = sizeof(struct sockaddr_in);
72.  
73.                 if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1)
74.                 {
75.                         perror("accept");
76.                         continue;
77.                 }
78.  
79.                 printf("server: got connection from %s\n", inet_ntoa(their_addr.sin_addr));
80.  
81.                 if (!fork())
82.                 {
83.                         close(sockfd);
84.  
85.                         if (send(new_fd, "Pengiriman data dengan stream socket berhasil!\n", 14, 0) == -1)
86.                         {
87.                                 perror("send");
88.                         }
89.  
90.                         close(new_fd);
91.                         exit(0);
92.                 }
93.  
94.                 close(new_fd);
95.         }
96.  
97.         return 0;
98.  
99. } 

Penjelasan dari server.c:
Pada program ini melakukan prosedur pembukaan koneksi yang didalamnya berupa langkah-langkah seperti membuat socket, mengikat socket, menyiapkan socket, menerima koneksi, dan pengalamatan socket.

Langkah-langkah menjalankan program:
1.       Simpan program client dengan nama client.c dan program server dengan nama server.c
2.       Lakukan instalasi gcc atau compiler untuk bahasa c lainnya pada program ini menggunakan os fedora
#yum install gcc
3.       Untuk kompilasi program dengan perintah:
#gcc client.c –o client
#gcc server.c –o server
4.       Untuk menjalankan program dengan perintah:
#./server
#./client <ip server>


Berikut tampilan output dari program tersebut:

Client

Server
 

Referensi:
http://salmaann.blogspot.com/2014/05/program-stream-socket.html#more

http://ilhampratamap.blogspot.com/2014/05/program-stream-socket.html

Tidak ada komentar:

Posting Komentar