You are on page 1of 24

Trng ai Hoc Bach Khoa Tp.

HCM

L P TRNH M NG DNG SOCKET TRN S D NG C

Bi Gi ng 3

Khoa H c v K Thu t My Tnh

Trang 1

Trng ai Hoc Bach Khoa Tp.HCM

L P TRNH SOCKET TRN UNIX


Qu n l socket

Unix: Integer Meaning


Create a new communication end point Attach a local address to a socket Announce willingness to accept connections; give queue size Block the caller until connection attempt arrives Actively attempt to establish a connection Send some data over the connection Receive some data from the connection Release the connection
Khoa Khoa H c v K Thu t My Tnh Trang 2

Primitives
SOCKET BIND LISTEN ACCEPT CONNECT SEND RECEIVE CLOSE

Trng ai Hoc Bach Khoa Tp.HCM

L P TRNH SOCKET TRN UNIX

Khoa Khoa H c v K Thu t My Tnh

Trang 3

Trng ai Hoc Bach Khoa Tp.HCM

L P TRNH SOCKET TRN UNIX

Khoa Khoa H c v K Thu t My Tnh

Trang 4

Trng ai Hoc Bach Khoa Tp.HCM

L P TRNH SOCKET TRN UNIX

Khoa Khoa H c v K Thu t My Tnh

Trang 5

Trng ai Hoc Bach Khoa Tp.HCM

L P TRNH SOCKET TRN UNIX

Khoa Khoa H c v K Thu t My Tnh

Trang 6

Trng ai Hoc Bach Khoa Tp.HCM

L P TRNH SOCKET TRN UNIX

Khoa Khoa H c v K Thu t My Tnh

Trang 7

Trng ai Hoc Bach Khoa Tp.HCM

L P TRNH SOCKET TRN UNIX

Khoa Khoa H c v K Thu t My Tnh

Trang 8

Trng ai Hoc Bach Khoa Tp.HCM

L P TRNH SOCKET TRN UNIX


Thng tin v cc hm dng cho l p trnh socket int socket(int domain, int type, int protocol); Trong :

domain (af): h a ch , th ng s d ng l AF_INET: Internet address type : Ki u socket (SOCK_STREAM, SOCK_DGRAM) protocol : giao th c c dng, default = 0

int bind(int sockfd, struct sockaddr *my_addr, int addrlen); Trong :


sockfd: l socket file descriptor tr v t hm socket my_addr : a pointer to a struct sockaddr (ch a: address, port and IP address ...) addrlen = sizeof(struct sockaddr).
Khoa Khoa H c v K Thu t My Tnh Trang 9

Trng ai Hoc Bach Khoa Tp.HCM

L P TRNH SOCKET TRN UNIX


Thng tin v cc hm dng cho l p trnh socket int connect(int sockfd, struct sockaddr *serv_addr, int addrlen); Trong :
- sockfd l socket file descriptor. - serv_addr l struct sockaddr ch a port & IP address ch - addrlen = sizeof(struct sockaddr).

int listen(int sockfd, int backlog); Trong :


- sockfd l socket file descriptor. - backlog l s k t n i cho php c a hng i. Cc yu c u connect c a i tc s c lu trong queue cho t i khi c accept
Khoa Khoa H c v K Thu t My Tnh Trang 10

Trng ai Hoc Bach Khoa Tp.HCM

L P TRNH SOCKET TRN UNIX


Thng tin v cc hm dng cho l p trnh socket int accept(int sockfd, void *addr, int *addrlen); Trong :
- sockfd l socket file descriptor. - addr l pointer tr t i sockaddr_in. Xc nh ai k t n i t i, k t n i t port no. - addrlen l bi n int = sizeof(struct sockaddr_in)

int send(int sockfd, const void *msg, int len, int flags); int recv(int sockfd, void *buf, int len, unsigned int flags); int read(int sockfd, const void *buf, int len); int write(int sockfd, const void *buf, int len);
Khoa Khoa H c v K Thu t My Tnh Trang 11

Trng ai Hoc Bach Khoa Tp.HCM

L P TRNH SOCKET TRN UNIX


Thng tin v cc hm dng cho l p trnh socket int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen);
tolen c gi tr b ng sizeof(struct sockaddr).

int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int *fromlen);
fromlen kh i t o b ng sizeof(struct sockaddr).

Khoa Khoa H c v K Thu t My Tnh

Trang 12

Trng ai Hoc Bach Khoa Tp.HCM

L P TRNH SOCKET TRN UNIX


Thng tin v cc hm dng cho l p trnh socket

Khoa Khoa H c v K Thu t My Tnh

Trang 13

Trng ai Hoc Bach Khoa Tp.HCM

L P TRNH SOCKET V I UDP


CLIENT
socket()

SERVER
socket()

bind()
data

sendto() receivefrom()

receivefrom() sendto()

client address

data

close()

close()
Khoa Khoa H c v K Thu t My Tnh Trang 14

Trng ai Hoc Bach Khoa Tp.HCM

L P TRNH SOCKET V I UDP


socket() socket() bind() sendto()
data

receivefrom() close()
client address

socket() receivefrom() sento()/receivefrom( ) close()

NEW PROCESS

data

sendto() sendto()/receivefrom( ) close()

Khoa Khoa H c v K Thu t My Tnh

Trang 15

Trng ai Hoc Bach Khoa Tp.HCM

L P TRNH SOCKET V I TCP


CLIENT
socket()

SERVER
socket() bind() listen()

connect() send()/receive()

connection request

accept() send()/receive()

newsocket

data

close()

close(mainsocket) close(newsocket)
Khoa Khoa H c v K Thu t My Tnh Trang 16

Trng ai Hoc Bach Khoa Tp.HCM

L P TRNH SOCKET V I TCP


CLIENT
socket() socket() bind()
connection request

SERVER

listen() accept() close(mainsocket )

connect()

newsocket

send()/receive() close()

data

send()/receive()
NEW PROCESS close(newsocket)

Khoa Khoa H c v K Thu t My Tnh

Trang 17

Trng ai Hoc Bach Khoa Tp.HCM

L P TRNH SOCKET V I TCP


DateTime Client
#include <sys/types.h> #include <sys/socket.h> int main(int argc, char **argv) { int sockfd, n; char recvline[MAXLINE + 1]; struct sockaddr_in servaddr; if( argc != 2 ) printf("Usage : gettime <IP address>"); exit(1); /* Create a TCP socket */ if ( (sockfd = socket (AF_INET, SOCK_STREAM, 0)) < 0) { perror("socket"); exit(2); }
Khoa Khoa H c v K Thu t My Tnh Trang 18

Trng ai Hoc Bach Khoa Tp.HCM

L P TRNH SOCKET V I TCP


DateTime Client (ti p theo)
/* Specify servers IP address and port */ bzero (&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons ( 13 ); if (inet_pton (AF_INET, 127.0.0.1, &servaddr.sin_addr) <= 0) { perror("inet_pton"); exit(3); } /* Connect to the server */ if ( connect( sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0 ) { perror("connect"); exit(4); }
Khoa Khoa H c v K Thu t My Tnh Trang 19

Trng ai Hoc Bach Khoa Tp.HCM

L P TRNH SOCKET V I TCP


DateTime Client (ti p theo)
/* Read the date/time from socket */ while ( (n = read ( sockfd, recvline, MAXLINE)) > 0) { recvline[n] = \0; /* null terminate */ printf(%s, recvline); } if (n < 0) { perror("read"); exit(5); } close ( sockfd ); }
Khoa Khoa H c v K Thu t My Tnh Trang 20

Trng ai Hoc Bach Khoa Tp.HCM

L P TRNH SOCKET V I TCP


DateTime Server
#include <sys/types.h> #include <sys/socket.h> int main (int argc, char **argv) { int listenfd, connfd; struct sockaddr_in servaddr, cliaddr; char buff[MAXLINE]; time_t ticks; /* Create a TCP socket */ listenfd = socket (AF_INET, SOCK_STREAM, 0); /* Initialize servers address and well-known port */ bzero (&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl (INADDR_ANY); servaddr.sin_port = htons (13);
Khoa Khoa H c v K Thu t My Tnh Trang 21

Trng ai Hoc Bach Khoa Tp.HCM

L P TRNH SOCKET V I TCP


DateTime Server (ti p theo)
/* Bind servers address and port to the socket */ bind (listenfd, (struct sockaddr*) &servaddr, sizeof( servaddr)); /* Convert socket to a listening socket */ listen (listenfd, 100); for ( ; ; ) { /* Wait for client connections and accept them */ clilen = sizeof(cliaddr); connfd = accept( listenfd, (struct sockaddr *)&cliaddr, &clilen); ticks = time(NULL); snprintf( buff, sizeof(buff),"%.24s\r\n",ctime(&ticks)); /* Write to socket */ write( connfd, buff, strlen(buff) ); /* Close the connection */ close( connfd ); } }
Khoa Khoa H c v K Thu t My Tnh Trang 22

Trng ai Hoc Bach Khoa Tp.HCM

BI T P
Vi t chng trnh nslookup b ng C trn Unix/Linux Vi t echo Client/Server b ng C trn Unix/Linux Vi t m t Web Server c nh ng c i m sau:

H tr phng th c GET (GET xxx.html HTTP/1.0) HTTP p ng c a Server c header nh ExServer/b1.0 H tr multithread V d Browser Request:
GET /intro.html HTTP/1.0 WebServer Response

Server Reponse
case 1: HTTP/1.0 200 OK case 2: HTTP/1.0 404 File Not Found case 3: HTTP/1.0 501 Not Implemented
Khoa Khoa H c v K Thu t My Tnh Trang 23

Trng ai Hoc Bach Khoa Tp.HCM

TONG KET
Khi ni m socket Thi t k gi i thu t cho client v server L p trnh m ng trn Java L p trnh socket trn UNIX

Khoa Khoa H c v K Thu t My Tnh

Trang 24

You might also like