Socket Programming TCP

Socket programming merupakan pemrogramman yang bertujuan agar satu program dapat berinteraksi dengan program lainnya dalam satu jaringan. Penggunaan socket programming memungkinkan adanya komunikasi antara client dan server. Salah satu contohnya sederhana penggunaan socket programming adalah pembuatan program untuk chatting. Program tersebut sebenarnya merupakan bentuk aplikasi komunikasi antara server dan client. Berikut adalah contoh socket programming client server yang dibuat menggunakan bahasa C :

CLIENT

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>

#define PORT 3333
#define MAXDATASIZE 100

Bagian diatas ini merupakan deskripsi dari nomor port yang digunakan yaitu “3333” dan dibawahnya adalah jumlah byte maksimal yang dikirimkan.

int main(int argcchar const *argv[])
{
        int sockfd, numbytes;
        char buf[MAXDATASIZE];
        struct hostent *he;
        struct sockaddr_in their_addr;

Blok diatas berisikan informasi alamat dari server.

        if (argc != 2)
        {
                fprintf(stderr"usage: client hostname\n");
                exit(1);
        }

        if ((he=gethostbyname(argv[1])) == NULL)
        {
                perror("gethostbyname");
                exit(1);
        }

Blok diatas untuk mencari info tentang host.

        if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
        {
                perror("socket");
                exit(1);
        }

Blok diatas untuk membuat socket dengan perintah socket. “AF_NET” menunjukkan bahwa socket dihubungkan dengan protocol internet, dan “SOCK_STREAM” menunjukkan bahwa program ini memakai stream socket atau TCP, yang berarti connection oriented.

        their_addr.sin_family = AF_INET;
        their_addr.sin_port = htons(PORT);
        their_addr.sin_addr = *((struct in_addr *)he->h_addr);
        memset(&(their_addr.sin_zero)'\0'8);

Pada baris awal yaitu untuk host byte order atau big endian. Baris selanjutnya untuk network byte order. Dan yang lainnya diisi 0.

        if (connect(sockfd(struct sockaddr *)&their_addr, sizeof(struct sockaddr)) == -1)
        {
                perror("connect");
                exit(1);
        }

        if ((numbytes=recv(sockfd, buf, MAXDATASIZE-10)) == -1)
        {
                perror("recv");
                exit(1);
        }

        buf[numbytes] '\0';
        printf("Received: %s", buf);
        close(sockfd);
        return 0;
}
                     
Blok program diatas merupakan proses koneksi ke server untuk melakukan proses pengiriman data ke server dengan perintah connect(). Selanjutnya terdapat proses penerimaan data yang datang dari server dengan perintah “recv”. Dan diakhiri dengan menutup hubungan dengan perintah close().


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>
#include <sys/wait.h>
#include <signal.h>

#define MYPORT 3333
#define BACKLOG 10

Bagian diatas ini merupakan deskripsi dari nomor port yang digunakan yaitu “3333” dan dibawahnya adalah jumlah koneksi yang diperbolehkan.


void sigchld_handler(int s)
{
        while(wait(NULL) 0);
}

int main(void)
{
        int sockfd, new_fd;
        struct sockaddr_in my_addr;
        struct sockaddr_in their_addr;
        int sin_size;
        struct sigaction sa;
        int yes=1;

Pada blok diatas terdapat “sockfd” yang merupakan koneksi saat ini dan “newfd” merupakan koneksi baru. Baris selanjutnya merupakan penetapan ip address server dan dilanjutkan penetapan ip address dari client.

        if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
        {
                perror("socket");
                exit(1);
        }

Blok di atas adalah untuk membuat socket dengan perintah socket().“AF_NET” menunjukkan bahwa socket dihubungkan dengan protocol internet, dan “SOCK_STREAM” menunjukkan bahwa program ini memakai stream socket atau TCP, yang berarti connection oriented.

        if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1)
        {
                perror("setsockopt");
                exit(1);
        }

        my_addr.sin_family = AF_INET;
        my_addr.sin_port = htons(MYPORT);
        my_addr.sin_addr.s_addr = INADDR_ANY;
        memset(&(my_addr.sin_zero)'\0'8);

Blok diatas untuk melakukan proses pengalamatan. Pada baris awal yaitu untuk host byte order atau big endian. Baris selanjutnya untuk network byte order. Baris ketiga disi dengan ip address server. Dan yang lainnya diisi 0.
        if (bind(sockfd(struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
        {
                perror("bind");
                exit(1);
        }

Blok di atas adalah untuk mengikatkan socket kepada sebuah alamat network dengan perintah bind().

        if (listen(sockfd, BACKLOG) == -1)
        {
                perror("listen");
                exit(1);
        }

Blok di atas adalah untuk menerima koneksi yang masuk dengan perintah listen().

        sa.sa_handler = sigchld_handler;
        sigemptyset(&sa.sa_mask);
        sa.sa_flags = SA_RESTART;

        if (sigaction(SIGCHLD, &sa, NULL) == -1)
        {
                perror("sigaction");
                exit(1);
        }

        while(1)
        {
                sin_size sizeof(struct sockaddr_in);

                if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1)
                {
                        perror("accept");
                        continue;
                }

Blok di atas adalah untuk menerima koneksi yang masuk meserver dengan perintah accept().

                printf("server: got connection from %s\n", inet_ntoa(their_addr.sin_addr));

                if (!fork())
                {
                        close(sockfd);

                        if (send(new_fd"Pengiriman data dengan stream socket berhasil!\n"140) == -1)
                        {
                                perror("send");
                        }

                        close(new_fd);
                        exit(0);
                }

Blok di atas adalah untuk melakukan proses komunikasi dengan client yaitu proses menerima dan mengirim data dengan perintah read(). Lalu menutup socket.

                close(new_fd);
        }

        return 0;

}


LANGKAH-LANGKAH MENJALANKAN PROGRAM

1.  Simpan program client dengan nama client.c dan program server dengan server.c.

2.   Lakukan instalasi gcc atau compiler untuk bahasa c lainnya (menggunakan os fendora) :

·         #yum install gcc

3.    Lakukan kompilasi program :

·         #gcc client.c –o client
·         #gcc server.c –o server

4.    Jalankan program server lalu dilanjutkan dengan menjalankan program client :

·         #./server

·         #./client <ip server>


OUTPUT SERVER DAN CLIENT





Penulis : Bagus Bayu Baskara ~ Sebuah blog yang menyediakan berbagai macam informasi

Artikel Socket Programming TCP ini dipublish oleh Bagus Bayu Baskara pada hari Sabtu, 24 Mei 2014. Semoga artikel ini dapat bermanfaat.Terimakasih atas kunjungan Anda silahkan tinggalkan komentar.sudah ada 0 komentar: di postingan Socket Programming TCP
 

0 komentar:

Posting Komentar