Network programming
1
L p trình Socketậ
Giáo viên: Nguyễn Hoài Sơn
Bộ môn Mạng và Truyền thông máy tính
Khoa Công nghệ thông tin
Network programming
2
N i dungộ
Gi i thi u v socket ớ ệ ề
Các hàm socket v i mô hình khách ch TCPớ ủ
Ví d v mô hình khách ch TCPụ ề ủ
Các hàm socket v i mô hình khách ch UDPớ ủ
Ví d v mô hình khách ch UDPụ ề ủ
Chuy n tên mi n DNS thành a ch IPể ề đị ỉ
Network programming
3
Giao th c TCP/IPứ
ModemATMFDDIEthernet
IP
Network
TCP UDP
FTP TFTPNVHTTP
Application
Layers
Physical
Data Link
Transport
Network programming
4
Mô hình khách chủ
Client Server
1. Client sends request
2. Server
handles
request
3. Server sends response
4. Client
handles
response
Resource
H u h t các ng d ng m ng u d a trên mô hình d ch v ầ ế ứ ụ ạ đề ự ị ụ
khách-ch :ủ
Máy chủ quản lý một số tài nguyên
Máy chủ cung cấp dịch vụ cho máy khách dựa trên tài
nguyên quản lý.
Network programming
5
CLOSED
BEGIN
LISTEN
Server Passive Open
SYN SENT
Active Open
send SYN
Client Active Open
send SYN
SYN RCVD
rcv SYN
send SYN,ACK
rcv SYN
send SYN,ACK
rcv RST
ESTABLISHED
rcv ACK of SYN
rcv SYN,ACK
send ACK
FIN WAIT-1
FIN WAIT-2
CLOSE_WAIT
CLOSING
TIME_WAIT
LAST_ACK
send FIN
rcv ACK
rcv FIN
send ACK
timer ~ 1 min
rcv FIN,ACK
send ACK
rcv FIN
send ACK
rcv ACK
send FIN
rcv FIN
send ACK
send FIN
rcv ACK
Tr ng thái k t n i TCPạ ế ố
Network programming
6
Giao di n ch ng trình v i giao th c ệ ươ ớ ứ
TCP/IP
Chu n TCP/IP không quy nh giao di n c a ph n m m ng d ng v i ẩ đị ệ ủ ầ ề ứ ụ ớ
ph n mêm th c thi giao th c TCP/IPầ ự ứ
Việc thực thi giao thức TCP/IP tùy thuộc vào mỗi hệ
thống
Giao diện này có thể khác nhau với mỗi hệ điều hành
Giao diện Socket (BSD Unix), mô hình STREAMS
(UNIX System V)
Network programming
7
Các ch c năng c a giao di nứ ủ ệ
C p phát tài nguyên cho m t cu c truy n tinấ ộ ộ ề
Xác nh i m cu i c a hai bên truy n tin đị để ố ủ ề
Kh i t o m t k t n i (phía máy khách)ở ạ ộ ế ố
i m t cu c k t n i m i n (phía máy ch )Đợ ộ ộ ế ố ớ đế ủ
G i/nh n d li uử ậ ữ ệ
K t thúc t t p m t cu c k t n iế ố đẹ ộ ộ ế ố
…
Network programming
8
Giao di n Socketệ
Mô hình socket c s d ng r ng rãi hi n nayđượ ử ụ ộ ệ
Chủ yếu nhờ được thực thi rộng rãi trên mô hình mạng
BSD
Được cung cấp lần đầu tiên với hệ điều hành BSD
Unix 4.1c
Được phổ biến trên hệ điều hành BSD Unix 4.3
năm 1986
Hiện được dùng trên Unix, Windows, MAC,
Cung c p các ch c n ng c b n h tr vi c truy n tin ấ ứ ă ơ ả ỗ ỡ ệ ề
trên m ng v i nhi u lo i giao th cạ ớ ề ạ ứ
Không chỉ giao thức TCP/IP
Network programming
9
Socket là gì?
V i OS, socket là i m cu i c a s truy n tinớ để ố ủ ự ề
Thực thi giao thức TCP/IP
V i m t ng d ng, socket là m t mô t file cho phép các ng d ng ớ ộ ứ ụ ộ ả ứ ụ
c/ghi t m ngđọ ừ ạ
Máy chủ và máy khách liên lạc với nhau bằng cách đọc và viết
vào mô tả socket
Sử dụng như các lệnh gọi I/O truyền thống
Các lệnh gọi I/O truyền thống: open, close, read, write, lseek, ioctl
Network programming
10
C u trúc d li u h th ng cho ấ ữ ệ ệ ố
sockets
a pointer to internal data
structure for file 0
a pointer to internal data
structure for file 1
a pointer to internal data
structure for file 2
a pointer to internal data
structure for file 3
family: AF_INET
service: SOCK_STREAM
protocol: TCP
local IP:
remote IP:
local Port:
remote Port:
0:
1:
2:
3:
Bảng mô tả file
4:
…
Network programming
11
Mô hình khách ch TCPủ
TCP client
TCP server
socket()
socket()
bind()
listen()
accept()
read()
write()
close()
read()
connect()
write()
close()
Connection
request
EOF
Wait next
request
Process request
read()
data (request)
data (reply)
Network programming
12
socket() : T o socketạ
family = Họ địa chỉ (address family)
AF_INET (TCP/IP)
AF_INET6
type = Kiểu socket
SOCK_STREAM (TCP)
SOCK_DGRAM (UDP)
SOCK_RAW
protocol
0 nếu sử dụng mặc định của hệ thống
Cấn thiết lập trong trường hợp của SOCK_RAW (IP) sockets
#include <sys/socket.h>
int socket (int family, int type, int protocol);
Returns: non-negative descriptor if OK, -1 on error
Network programming
13
int sockfd; /* socket descriptor */
if((sockfd = socket(AF_INET, SOCK_STREAM,0)) <
0) {
perror(“socket”);
exit(1);
}
socket trả về giá trị nguyên là một mô tả socket
sockfd < 0 khi có lỗi tạo socket
AF_INET: gán socket với họ giao thức IPv4
SOCK_STREAM: gán kiểu socket là stream
0: sử dụng giao thức mặc định (TCP)
Ví d v t oTCP socketụ ề ạ
Network programming
14
bind() : Gán đ a ch cho socketị ỉ
sockfd = Mô tả file cho socket được tạo ra
sockaddr = Con trỏ trỏ đến cấu trúc địa chỉ socket
addrlen = độ lớn địa chỉ
#include <sys/socket.h>
int bind (int sockfd, const struct sockaddr *sockaddr, socklen_t addrlen);
Returns: 0 if OK,-1 on error
Network programming
15
C u trúc đ a ch socketấ ị ỉ
C u trúc a ch socket chung:ấ đị ỉ
Dùng như là tham số địa chỉ trong các lệnh gọi connect, bind, and
accept.
Cần thiết chỉ vì khi thiết kế giao diện docket, C đã không có con trỏ kiểu
void*
a ch socket riêng c a Internet:Đị ỉ ủ
Phải gán (sockaddr_in *) thành (sockaddr *) trong các lệnh gọi connect,
bind, and accept.
struct sockaddr {
unsigned short sa_family; /* protocol family */
char sa_data[14]; /* address data. */
};
struct sockaddr_in {
unsigned short sin_family; /* address family (always AF_INET) */
unsigned short sin_port; /* port num in network byte order */
struct in_addr sin_addr; /* IP addr in network byte order */
unsigned char sin_zero[8]; /* pad to sizeof(struct sockaddr) */
};
Network programming
16
int sockfd; /* socket descriptor */
struct sockaddr_in sockaddr; /* used by bind() */
/* create the socket */
bzero(&servaddr, sizeof(servaddr)); /* */
sockaddr.sin_family = AF_INET; /* use the Internet addr family */
sockaddr.sin_port = htons(123); /* bind socket ‘sockfd’ to port
123*/
/* kernel choose IP address bound for the socket */
sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(sockfd, (struct sockaddr*) &sockaddr, sizeof(sockaddr)) <
0) {
perror("bind"); exit(1);
}
Ví d v gán đ a ch socketụ ề ị ỉ
Network programming
17
Các hàm chuy n đ i th t Byteể ổ ứ ự
‘h’ : host byte order ‘n’ : network byte order
‘s’ : short (16bit) ‘l’ : long (32bit)
#include <netinet/in.h>
uint16_t htons(uint16_t);
uint16_t ntohs(uint_16_t);
uint32_t htonl(uint32_t);
uint32_t ntohl(uint32_t);
Network programming
18
S c n thi t c a vi c chuy n đ i th t ự ầ ế ủ ệ ể ổ ứ ự
byte
Bi u di n d li u 16 bitể ễ ữ ệ
Network programming
19
Các hàm x lý bufferử
#include <strings.h>
void bzero(void *dest, size_t nbytes);
void bcopy(const void *src, void *dest, size_t nbytes);
int bcmp(const void *ptr1, const void *ptr2, size_t nbytes);
Returns: 0 if equal, nonzero if unequal
#include <string.h>
void *memset(void *dest, int c, size_t len);
void *memcpy(void *dest, const void *src, size_t nbytes);
int memcmp(const void *ptr1, const void *ptr2, size_t nbytes);
Returns: 0 if equal, <0 or >0 if unequal
Network programming
20
listen() : Ch đ nh socket l ng nghe k t ỉ ị ắ ế
n iố
sockfd = Mô tả file của socket đã tạo
backlog = Số lượng tối đa của các kết nối đang chờ
#include <sys/socket.h>
int listen (int sockfd, int backlog);
Returns: 0 if OK, -1 on error
Network programming
21
Ví d s d ng hàm listen()ụ ử ụ
int sockfd; /* socket descriptor */
struct sockaddr_in sockaddr; /* used by bind()
*/
/* 1) create the socket */
/* 2) bind the socket to a port */
if(listen(sockfd, 5) < 0) {
perror(“listen”);
exit(1);
}
Network programming
22
accept (): Ch k t n i đ nờ ế ố ế
sockfd = Mô t file c a socket chả ủ ờ
cliaddr = Con tr t i c u trúc a ch socket c a ti n trình k t n i nỏ ớ ấ đị ỉ ủ ế ế ố đế
addrlen = l n c a c u trúc a chĐộ ớ ủ ấ đị ỉ
Hàm accept g i tr v m t socket m i có các tham s gi ng nh socket ử ả ề ộ ớ ố ố ư
ch (ờ sockfd)
Máy chủ có thể sử dụng socket mới này để trao đổi dữ liệu với máy
khách bằng các lệnh gọi read/write
#include <sys/socket.h>
int accept (int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen);
Returns: non-negative descriptor if OK, -1 on error
Network programming
23
accept() (2)
Three way
handshake
complete
TCP
Server
accept
Completed
connection queue
Incomplete
connection queue
Network programming
24
Ví d v hàm accept ()ụ ề
int sockfd; /* socket descriptor */
struct sockaddr_in cliaddr; /* used by accept() */
int newfd; /* returned by accept() */
int cliaddr_len = sizeof(cli); /* used by accept() */
/* 1) create the socket */
/* 2) bind the socket to a port */
/* 3) listen on the socket */
newfd = accept(sockfd, (struct sockaddr*) &cliaddr, &cliaddr_len);
if(newfd < 0) {
perror("accept"); exit(1);
}
Máy chủ biết thông tin máy khách bằng cách nào?
cliaddr.sin_addr.s_addr chỉ định địa chỉ IP của máy khách
cliaddr.sin_port chỉ định cổng của máy khách
Network programming
25
connect(): Thi t l p m t k t n i v i máy ế ậ ộ ế ố ớ
ch TCPủ
sockfd = Mô t file c a socket ã t o raả ủ đ ạ
servaddr = Con tr t i c u trúc a ch socket c a máy ch k t ỏ ớ ấ đị ỉ ủ ủ ế
n iố
addrlen = kích th c c u trúc a chướ ấ đị ỉ
#include <sys/socket.h>
int connect (int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);
Returns: 0 if OK, -1 on error