Berikut contoh program client server yang menggunakan datagram socket yang dibuat dengan bahasa C.
- Client
/*
** client02.c -- a datagram
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#define MYPORT 4950 // no port server yang digunakan
int main(int argc, char *argv[])
{
int sockfd;
struct sockaddr_in their_addr; // ip server
struct hostent *he;
int numbytes;
if (argc != 3)
{
fprintf(stderr,"usage: client hostname message\n");
exit(1);
}
// dpt info tentang host
if ((he=gethostbyname(argv[1])) == NULL)
{
perror("gethostbyname");
exit(1);
}
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
{
perror("socket");
exit(1);
}
their_addr.sin_family = AF_INET; // host byte order
their_addr.sin_port = htons(MYPORT); // host to network short
their_addr.sin_addr = *((struct in_addr *)he->h_addr);
memset(&(their_addr.sin_zero), '\0', 8); // set semua nilai ke 0
if ((numbytes=sendto(sockfd, argv[2], strlen(argv[2]), 0, (struct sockaddr *)&their_addr, sizeof(struct sockaddr))) == -1)
{
perror("sendto");
exit(1);
}
printf("Kirim %d byte ke %s\n", numbytes,
inet_ntoa(their_addr.sin_addr));
close(sockfd);
return 0;
}
Berikut penjelasan dari program client:
- Server
/*
** server02.c -- a datagram sockets "server"
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define MYPORT 4950 // no port server
#define MAXBUFLEN 100
int main(void)
{
int sockfd;
struct sockaddr_in my_addr; // ip address server
struct sockaddr_in their_addr; // ip address client
int addr_len, numbytes;
char buf[MAXBUFLEN];
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
{
perror("socket");
exit(1);
}
my_addr.sin_family = AF_INET; // host byte order
my_addr.sin_port = htons(MYPORT); // host to network short
my_addr.sin_addr.s_addr = INADDR_ANY; // ip address server
memset(&(my_addr.sin_zero), '\0', 8); // set semua nilai menjadi 0
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
{
perror("bind");
exit(1);
}
addr_len = sizeof(struct sockaddr);
if ((numbytes=recvfrom(sockfd,buf, MAXBUFLEN-1, 0, (struct sockaddr *)&their_addr, &addr_len)) == -1)
{
perror("recvfrom");
exit(1);
}
printf("Mendapat paket dari : %s\n",inet_ntoa(their_addr.sin_addr));
printf("Panjang paket : %d bytes \n",numbytes);
buf[numbytes] = '\0';
printf("Isi paket : \"%s\"\n",buf);
close(sockfd);
return 0;
}
Berikut penjelasan dari program server:
Langkah-langkah menjalankan program:
- Simpan source program client dengan nama client2.c dan server dengan nama server2.c
- Lakukan installasi gcc yang sudah dijelaskan pada artikel sebelumnya.
- Lakukan kompilasi pada program.
#gcc client2.c -o client2 #gcc server2.c -o server2
- Jalankan program server, kemudian jalankan program client pada komputer client.
#./server2 #./client2 <alamat ip server> <pesan tanpa spasi/dalam tanda kutip>
Berikut tampilan outputnya:
- Client
- Server
Mengecek port yang digunakan oler server dengan menggunakan perintah berikut:
# netstat -nlptu | grep server2
Berikut tampilan outputnya:
Dari output tersebut dapat terlihat bahwa program server melakukan listening menggunakan port 4950 dan menggunakan protokol udp.
Selanjutnya mengecek port yang digunakan oleh client dengan menggunakan perintah berikut:
# tcpdump -nt -i (interface yang digunakan)
Berikut tampilan outputnya:
Dari output tersebut terlihat bahwa program client menggunakan port 53341 yang merupakan random port apabila program client dijalankan kembali maka port yang digunakan akan berubah.
Referensi:
Materi V-Class Gunadarma: Datagram Socket Programming