komputek-anime.blogspot.com Yondaime Images Wallpaper Hitsugaya ban-kai Images Wallpaper Naruto And Kyuubi Wallpaper Kakashi Cape Wallpaper Anbu Kakashi Wallpaper Uchiha Madara Wallpaper Grimmjaw Sixth Espada Wallpaper Kuchiki Byakuya-searching For Purpose Wallpaper

Sabtu, 31 Mei 2014

Program Datagram Socket

Program Datagram Socket
TUGAS JARKOM LANJUT

PENDAHULUAN
Penggunaan socket programming memungkinkan adanya komunikasi antara client dan server. Salah satu contoh sederhana penggunaan socket programming adalah pembuatan program untuk chatting. Program tersebut sebenarnya merupakan bentuk aplikasi berupa komunikasi antara client dan server. Ketika seorang user (client) melakukan koneksi ke chat server, program akan membuka koneksi ke port yang diberikan, sehingga server perlu membuka socket pada port tersebut dan “mendengarkan” koneksi yang datang. Socket sendiri merupakan gabungan antara host-adress dan port adress. Dalam hal ini socket digunakan untuk komunikasi antara client dan server.
Proses datagram Jika client mengirimkan data ke server, data tersebut ada kemungkinan sampai ke server atau tidak. Untuk ituclient menunggu isyarat ‘error free’ daripada client. Jika client tidak menerima isyarat ‘error free’ dalam satu jangka waktu, maka clientakan mengirimkan lagi data tersebut. Contoh aplikasi yang menggunakan datagram socket adalah tftp dan bootp.
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgV9RtWUxBs2wVYBL534a8EDUjNcVi6BOzA4RIIodev8JaUCfzFAC2oYfxvF3sudmgMxmv-3kyaYp7I0LJxJczwBTZnVlscXvRb5iMkqHxfFmCRpEyfoquW8ABYAaLd5PzuF3BZUqZfz2M/s320/haizum2.jpg
Data yang dikirimkan melalui datagram socket akan melalui proses yang diberi nama enkapsulasi (data encapsulation). Data yang akan dikirimkan sebelumnya dibungkus dulu dengan sebuah header dari protokol yang pertama (misalnya TFTP), lalu dibungkus lagi dengan protokol berikutnya (misalnya UDP), lalu IP dan yang terakhir dibungkus dengan ethernet protokol pada physical layer.

https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvMtMeQxx5EhWckOa1nxGUgRAzuyYNRE7BNW-xI_TMcEcFmmSiv71hWCcujynIDshJV7fEp1CkCbOapwzV29IhSfQ5dS1qsdXaidJL6ph812-dgUl_ovR7Zi7VRLg2OyrNIvCGZUIy3ys/s320/haizum4.jpg

Algorithma pemprograman datagram socket
Pada socket datagram algoritmanya lebih sederhana, tidak memerlukan sambungan antara server dan client. Sehingga system call/function yang diperlukan, iaitu socket(), bind(), sendto() dan recvfrom(), sendto() dan recvfrom() adalah fungsi khusus yang digunakan untuk mengirim dan menerima data pada socket datagram.
Antara langkah – langkah yang dilakukan pada client dan server, pada socket datagram adalah seperti berikut :
1. Langkah – langkah di client :
a. Membuka connection client ke server, yang di dalamnya adalah :
i. Membuat socket dengan perintah socket().
ii. Melakukan pengalamatan ke server.
b. Melakukan komunikasi (mengirimkan data), dengan menggunakan perintah sendto()
c. Menutup hubungan dengan perintah close();

2. Langkah – langkah di server :
a. Membuat socket dengan perintah socket()
b. Mengikatkan socket kepada sebuah alamat network dengan perintah bind()
c. Melakukan komunikasi (menerima data), dengan menggunakan perintah recvfrom()

Jenis socket yang kedua yaitu datagram socket disebut juga connectionless socket sebab untuk interaksi client-server tidak harus selalu terhubung terus menerus. Jika client mengirimkan data ke server, data tersebut ada kemungkinan sampai ke server atau tidak. Untuk itu client menunggu sinyal ‘error free’ dari client. Jika client tidak menerima sinyal ‘error free’ dalam suatu kurun waktu, maka client akan mengirimkan lagi data tersebut. Contoh aplikasi yang menggunakan datagram socket adalah tftp dan bootp.

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:
Program ini memberikan paket kepada alamat server yang ditentukan melalui parameter pada saat dijalankan. Didalamnya termasuk membuat socket dengan memanfaatkan system call yang tersedia seperti socket(), listen() dan connect().
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:
Pada program server menggunakan socket untuk mendapatkan file descriptor dan menghitung jumlah paket dan memberikan informasi tersebut pada saat dijalankan, serta menggunakan memanfaatkan banyak system call seperti socket(), bind(), listen(), connect(), dll.

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
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4e3pPbkaWvlARLVgdPziI6z9hShh3RyddMQEOMOgr1gDCtCuhJCd9sbWWBCngXUijsH1cjad-nV20vl0vPoT3C2P81cLqBbVyu0fBnBbjcl9rjZ4I8Vwuc2AmiFbeU5CY1k6qEF-kLwzF/s1600/client2.png
Server
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnAwBDmtJwkhSg87i9yCO6tHF4jDLpYlkcER5CwUXWiw2QHyfRrOWLnvhfafnsHlM6VRhARzRL-xpWUjiDk-bQ9jJeVfxv-e1ZOTWtXj6uqxuHzjinrQlbymKLscBCGCwj9vDVO3fn3NLm/s1600/server2.png

Mengecek port yang digunakan oler server dengan menggunakan perintah berikut:

# netstat -nlptu | grep server2

Berikut tampilan outputnya:
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7D53-FMwieOIwfDP9Lka-T10ZDNwPX3gmXf_RzkygMPhtG44NIqmxO1VKlC1rRI3vo4K_ccuDgnIBHFBNXI6MFy-47Pbj1mmm0NNbQ4t2BjMUez7pwooDUyp4N9_G2XIROCNfhXhwpp5C/s1600/netstat.png

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:
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhK6d55Dx6Sv9UrXpnqr83eBMNoc3VtyO-Wb6iB4TY_pMIQA-K5vnjDJeHrwTimpITHj2KTzWRhkodPbgzV7vhyXwMq3V56MoB4M4zTfX9_rKBT2zYypMbJBHkfPbca1ZBDitfijlnzcirM/s1600/tcpdump.png

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.


Tidak ada komentar:

Posting Komentar