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.
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 ().
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. }
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
Tidak ada komentar:
Posting Komentar