Pertemuan 3 ELEMENTARY TCP SOCKETS Matakuliah : H0483 / Network Programming

Download Report

Transcript Pertemuan 3 ELEMENTARY TCP SOCKETS Matakuliah : H0483 / Network Programming

Matakuliah
Tahun
Versi
: H0483 / Network Programming
: 2008
: 2.0
Pertemuan 3
ELEMENTARY TCP SOCKETS
1
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
2
Outline Materi
•
•
•
•
•
•
•
•
socket function
connect function
bind function
listen function
accept function
read function
write function
Kasus : Merancang aplikasi Client –
Server
3
ELEMENTARY TCP SOCKETS
4
ELEMENTARY TCP SOCKETS
TCP/IP
5
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)
6
ELEMENTARY TCP SOCKETS
7
ELEMENTARY TCP SOCKETS
CONTOH :
int listensd;
listensd=socket(AF_INET,SOCK_STREAM,0);
if(listensd == -1){
perror("error socket");
exit(1);
}
8
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.
9
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)
}
10
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 */
};
11
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.
12
ELEMENTARY TCP SOCKETS
CONTOH:
#define LISTENQ 10
tmp=listen(listensd, LISTENQ);
if(tmp == -1){
perror("error listen");
exit(1);
}
13
ELEMENTARY TCP SOCKETS
Fungsi accept()
• Setelah memanggil fungsi listen(), maka
sistem operasi akan memasukkan
incoming connections, ke dalam queue
– Handles the 3-way handshake
14
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
15
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);
}
16
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
17
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");
exit(1);
}
18
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
19
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
20
Contoh Kasus
• Merancang aplikasi Client – Server
(DayTimeServer dan DayTimeClient)
dengan protocol TCP/IP
21
Contoh Kasus
22
DayTimeServer - TCP
#include
#include
#include
#include
#include
<sys/socket.h>
<netinet/in.h>
<arpa/inet.h>
<time.h>
<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;
23
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..");
exit(1);
}
24
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()
25
DayTimeClient - TCP
#include
#include
#include
#include
<sys/socket.h>
<netinet/in.h>
<arpa/inet.h>
<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);
}
26
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]);
exit(1);
}
27
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);
}
28
Latihan
• Rubahlah program DayTimeServer agar
setelah koneksi dengan client terputus
server ready accept() lagi, seperti gambar
berikut.
29
Latihan
30