Pertemuan 3 ELEMENTARY TCP SOCKETS I Made Astawa deastawa@yahoo.com
Learning Outcomes Pada akhir pertemuan ini, diharapkan mahasiswa dapat: menggunakan fungsi atau system call yang berhubungan dengan sockets pada Unix, Linux, untuk membuat program aplikasi Client Server
Kasus : Merancang aplikasi Client – Server Outline Materi socket function connect function bind function listen function accept function read function write function Kasus : Merancang aplikasi Client – Server
ELEMENTARY TCP SOCKETS
ELEMENTARY TCP SOCKETS TCP/IP
ELEMENTARY TCP SOCKETS Fungsi : socket() include <sys/socket.h> int socket(int family, int type, int protocol); Fungsi socket akan mengembalikan non-negatip descriptor jika sukses, dan akan mengembalikan –1 jika ada error. Umumnya parameter protocol pada fungsi socket di set 0 (protocol yg digunakan sesuai tabel, dibawah)
ELEMENTARY TCP SOCKETS
ELEMENTARY TCP SOCKETS CONTOH : int listensd; listensd=socket(AF_INET,SOCK_STREAM,0); if(listensd == -1){ perror("error socket"); exit(1); }
ELEMENTARY TCP SOCKETS Fungsi bind() Fungsi bind() digunakan untuk memberikan alamat (IP dan Nomor Port) ke socket descriptor. #include <sys/socket.h> int bind( int listensd, const struct sockaddr *myaddr, int addrlen); Fungsi bind() mengembalikan nilai 0 jika sukses, atau -1 jika terjadi error.
ELEMENTARY TCP SOCKETS CONTOH: int tmp; struct sockaddr_in servaddr; bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = INADDR_ANY; servaddr.sin_port = htons(13); tmp=bind(listensd,(struct sockaddr *)&servaddr, sizeof(struct sockaddr) if(tmp == -1){ perror("error bind.."); exit(1) }
ELEMENTARY TCP SOCKETS #include <netinet/in.h> struct in_addr{ u_long s_addr; /* 32-bit netid/hostid */ /* network byte ordered */ }; struct sockaddr_in { short sin_family; /*AF_INET*/ u_short sin_port; /*16 bit port number*/ /*network byte ordered*/ struct in_addr sin_addr; char sin_zero[8]; /* unused */
ELEMENTARY TCP SOCKETS Fungsi listen() #include <sys/socket.h> int listen( int listensd, int backlog); listensd adalah TCP socket (sudah diikat / bind ke suatu address & Port) backlog adalah jumlah “incoming connections” yg disimpan dalam antrian / queue. listen() returns -1 jika terjadi error atau 0 jika sukses.
ELEMENTARY TCP SOCKETS CONTOH: #define LISTENQ 10 tmp=listen(listensd, LISTENQ); if(tmp == -1){ perror("error listen"); exit(1); }
ELEMENTARY TCP SOCKETS Fungsi accept() Setelah memanggil fungsi listen(), maka sistem operasi akan memasukkan incoming connections, ke dalam queue Handles the 3-way handshake
ELEMENTARY TCP SOCKETS Fungsi accept() #include <sys/socket.h> int accept( int listensd, struct sockaddr* cliaddr, socklen_t *addrlen); listensd adalah TCP socket yang sudah dicreate sebelumnya. cliaddr adalah pointer ke struct sockaddr_in untuk menyimpan alamat dari client yang connect dengan server addrlen = size of cliaddr Fungsi accept() mengembalikan socket baru untuk komunikasi dan nilai -1 jika error
ELEMENTARY TCP SOCKETS CONTOH: int clisize,datasd; struct sockaddr_in cliaddr; clisize = sizeof(struct sockaddr_in); datasd=accept(listensd,(struct sockaddr *) &cliaddr, &clisize); if(datasd == -1){ perror("error accept"); exit(1); }
ELEMENTARY TCP SOCKETS Fungsi Connect() Fungsi connect() digunakan oleh fungsi client untuk melakukan koneksi dengan TCP Server. #include <sys/socket.h> int connect (int sockfd, const struct sockaddr *servaddr, socklen_t addrlen); sockfd adalah TCP Socket yang sudah di-create sebelumnya. servaddr berisi address server(IP Address and TCP port number) connect() returns 0 if OK, -1 on error
ELEMENTARY TCP SOCKETS struct sockaddr_in servaddr; bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(13); if(inet_pton(AF_INET, “192.168.90.25”, &servaddr.sin_addr) <= 0){ printf("inet_pton error"); exit(1); } if(connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0){ perror("connect error");
ELEMENTARY TCP SOCKETS Fungsi : read(), write() Fungsi read(), digunakan untuk menulis / mengirim data ke socket Fungsi write(), digunakan untuk membaca data dari socket Contoh: n = read(sockfd, buf, MAXLINE); Data yang dibaca disimpan pada buf, maximum data yang bisa dibaca dari socket adalah MAXLINE byte. fungsi read() mengembalikan nilai yang besarnya sama dengan jumlah byte yang dibaca. return 0 jika error
ELEMENTARY TCP SOCKETS Contoh: write(sockfd, buff, strlen(buff)); Data yang ditulis / dikirim ke socket ditempatkan pada buff fungsi write() return 0 jika terjadi error
Contoh Kasus Merancang aplikasi Client – Server (DayTimeServer dan DayTimeClient) dengan protocol TCP/IP
Contoh Kasus
DayTimeServer - TCP #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <time.h> #include <stdio.h> #define MAXLINE 100 #define LISTENQ 10 int main() { int tmp, listenfd, connfd; int sin_size; struct sockaddr_in servaddr, cliaddr; char buff[MAXLINE]; time_t ticks;
DayTimeServer - TCP //bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = INADDR_ANY; servaddr.sin_port = htons(13); memset(&(servaddr.sin_zero),'\0',8); listenfd = socket(AF_INET, SOCK_STREAM, 0); if(listenfd == -1){ perror("error socket"); exit(1); } tmp=bind(listenfd, (struct sockaddr *) &servaddr, sizeof(struct sockaddr)); if(tmp == -1){ perror("error bind..");
DayTimeServer - TCP tmp=listen(listenfd, LISTENQ); if(tmp == -1){ perror("error listen"); exit(1); } sin_size = sizeof(struct sockaddr_in); connfd=accept(listenfd,(struct sockaddr *) &cliaddr, &sin_size); if(connfd == -1){ perror("error accept"); exit(1); ticks = time(NULL); snprintf(buff,sizeof(buff),"Sekarang pukul: %.24s\r\n", ctime(&ticks)); write(connfd, buff, strlen(buff)); close(connfd); close(listenfd); } //main()
DayTimeClient - TCP #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #define MAXLINE 100 int main(int argc, char **argv) { int sockfd, n; char recvline[MAXLINE + 1]; struct sockaddr_in servaddr; if(argc != 2){ perror("usage: client <IPaddress>"); exit(1); }
DayTimeClient - TCP if((sockfd=socket(AF_INET,SOCK_STREAM,0)) < 0){ perror("socket error"); exit(1); } bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(13); if(inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){ printf("inet_pton error for %s", argv[1]);
DayTimeClient - TCP if(connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0){ perror("connect error"); exit(1); } while((n=read(sockfd,recvline, MAXLINE)) > 0){ recvline[n] = 0; /* null terminate */ if(fputs(recvline,stdout)==EOF) perror("fputs error"); if(n < 0) perror("read error"); close(sockfd); return(0);
Latihan Rubahlah program DayTimeServer agar setelah koneksi dengan client terputus server ready accept() lagi, seperti gambar berikut.
Latihan