Website Gunadarma

Senin, 26 Mei 2014

Program Stream Socket

Stream socket digunakan untuk sistem komunikasi 2 arah dan menggunakan protokol TCP (Transmission Control Protocol). Contoh aplikasi yang menggunakan stream socket adalah telnet dan HTTP (web browser). TCP menjamin data terkirim secara urutan dan bebas daripada kesalahan (error), sedangkan IP (Internet Protocol) bertugas untuk mengatur lalu-lintas routing.

Proses dalam TCP adalah:
1. 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.
3. 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.
4. 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 serverpada 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://haizum2009.blogspot.com/2009/08/stream-socket-tcp-transmission-control_11.html
http://salmaann.blogspot.com/2014/05/program-stream-socket.html#more