You are on page 1of 24

Trng ai Hoc Bach Khoa Tp.

HCM

LP TRNH MNG DNG SOCKET


TRN S DNG C

Bi Ging 3

Khoa Hc v K Thut My Tnh

Trang 1

Trng ai Hoc Bach Khoa Tp.HCM

LP TRNH SOCKET TRN UNIX




Qun l socket

Unix: Integer

Primitives

Meaning

SOCKET

Create a new communication end point

BIND

Attach a local address to a socket

LISTEN

Announce willingness to accept connections; give queue size

ACCEPT

Block the caller until connection attempt arrives

CONNECT

Actively attempt to establish a connection

SEND

Send some data over the connection

RECEIVE

Receive some data from the connection

CLOSE

Release the connection


Khoa Khoa Hc v K Thut My Tnh

Trang 2

Trng ai Hoc Bach Khoa Tp.HCM

LP TRNH SOCKET TRN UNIX

Khoa Khoa Hc v K Thut My Tnh

Trang 3

Trng ai Hoc Bach Khoa Tp.HCM

LP TRNH SOCKET TRN UNIX

Khoa Khoa Hc v K Thut My Tnh

Trang 4

Trng ai Hoc Bach Khoa Tp.HCM

LP TRNH SOCKET TRN UNIX

Khoa Khoa Hc v K Thut My Tnh

Trang 5

Trng ai Hoc Bach Khoa Tp.HCM

LP TRNH SOCKET TRN UNIX

Khoa Khoa Hc v K Thut My Tnh

Trang 6

Trng ai Hoc Bach Khoa Tp.HCM

LP TRNH SOCKET TRN UNIX

Khoa Khoa Hc v K Thut My Tnh

Trang 7

Trng ai Hoc Bach Khoa Tp.HCM

LP TRNH SOCKET TRN UNIX

Khoa Khoa Hc v K Thut My Tnh

Trang 8

Trng ai Hoc Bach Khoa Tp.HCM

LP TRNH SOCKET TRN UNIX


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

domain (af): h a ch, thng s dng l AF_INET: Internet address


type : Kiu socket (SOCK_STREAM, SOCK_DGRAM)
protocol : giao thc 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 (cha: address, port and IP address
...)
addrlen = sizeof(struct sockaddr).
Khoa Khoa Hc v K Thut My Tnh

Trang 9

Trng ai Hoc Bach Khoa Tp.HCM

LP TRNH SOCKET TRN UNIX


Thng tin v cc hm dng cho lp trnh socket
int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);
Trong :


- sockfd l socket file descriptor.


- serv_addr l struct sockaddr cha port & IP address ch
- addrlen = sizeof(struct sockaddr).

int listen(int sockfd, int backlog);


Trong :
- sockfd l socket file descriptor.
- backlog l s kt ni cho php ca hng i. Cc yu cu connect ca
i tc s c lu trong queue cho ti khi c accept
Khoa Khoa Hc v K Thut My Tnh

Trang 10

Trng ai Hoc Bach Khoa Tp.HCM

LP TRNH SOCKET TRN UNIX


Thng tin v cc hm dng cho lp trnh socket
int accept(int sockfd, void *addr, int *addrlen);
Trong :

- sockfd l socket file descriptor.


- addr l pointer tr ti sockaddr_in. Xc nh ai kt ni ti, kt ni t port no.
- addrlen l bin 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 Hc v K Thut My Tnh

Trang 11

Trng ai Hoc Bach Khoa Tp.HCM

LP TRNH SOCKET TRN UNIX


Thng tin v cc hm dng cho lp trnh socket
int sendto(int sockfd, const void *msg, int len, unsigned int flags,
const struct sockaddr *to, int tolen);


tolen c gi tr bng sizeof(struct sockaddr).

int recvfrom(int sockfd, void *buf, int len, unsigned int flags,
struct sockaddr *from, int *fromlen);
fromlen khi to bng sizeof(struct sockaddr).

Khoa Khoa Hc v K Thut My Tnh

Trang 12

Trng ai Hoc Bach Khoa Tp.HCM

LP TRNH SOCKET TRN UNIX




Thng tin v cc hm dng cho lp trnh socket

Khoa Khoa Hc v K Thut My Tnh

Trang 13

Trng ai Hoc Bach Khoa Tp.HCM

LP TRNH SOCKET VI UDP


SERVER

CLIENT
socket()

socket()

bind()

sendto()
receivefrom()

close()

data

data

receivefrom()

client address

sendto()

close()
Khoa Khoa Hc v K Thut My Tnh

Trang 14

Trng ai Hoc Bach Khoa Tp.HCM

LP TRNH SOCKET VI UDP


socket()

socket()
bind()
data

sendto()

receivefrom()
close()
client address

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

data

NEW PROCESS

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

Khoa Khoa Hc v K Thut My Tnh

Trang 15

Trng ai Hoc Bach Khoa Tp.HCM

LP TRNH SOCKET VI TCP


SERVER

CLIENT
socket()

socket()
bind()
listen()
connection request

connect()
send()/receive()

close()

data

accept()

newsocket

send()/receive()

close(mainsocket)
close(newsocket)
Khoa Khoa Hc v K Thut My Tnh

Trang 16

Trng ai Hoc Bach Khoa Tp.HCM

LP TRNH SOCKET VI TCP


CLIENT

SERVER

socket()

socket()
bind()

connect()

connection
request

listen()
accept()

close(mainsocket
)

newsocket

send()/receive()
close()

data

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

Khoa Khoa Hc v K Thut My Tnh

Trang 17

Trng ai Hoc Bach Khoa Tp.HCM

LP TRNH SOCKET VI 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 Hc v K Thut My Tnh

Trang 18

Trng ai Hoc Bach Khoa Tp.HCM

LP TRNH SOCKET VI TCP


 DateTime Client (tip 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 Hc v K Thut My Tnh

Trang 19

Trng ai Hoc Bach Khoa Tp.HCM

LP TRNH SOCKET VI TCP




DateTime Client (tip 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 Hc v K Thut My Tnh

Trang 20

Trng ai Hoc Bach Khoa Tp.HCM

LP TRNH SOCKET VI 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 Hc v K Thut My Tnh

Trang 21

Trng ai Hoc Bach Khoa Tp.HCM

LP TRNH SOCKET VI TCP




DateTime Server (tip 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 Hc v K Thut My Tnh

Trang 22

Trng ai Hoc Bach Khoa Tp.HCM

BI TP




Vit chng trnh nslookup bng C trn Unix/Linux


Vit echo Client/Server bng C trn Unix/Linux
Vit mt Web Server c nhng c im sau:

H tr phng thc GET (GET xxx.html HTTP/1.0)


HTTP
p ng ca 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 Hc v K Thut My Tnh

Trang 23

Trng ai Hoc Bach Khoa Tp.HCM

TONG KET





Khi nim socket


Thit k gii thut cho client v server
Lp trnh mng trn Java
Lp trnh socket trn UNIX

Khoa Khoa Hc v K Thut My Tnh

Trang 24

You might also like