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