Chương 3
1
LẬP TRÌNH WINSOCK
(Windows Socket)
Nội dung
Giới thiệu Winsock
BSD socket trong Windows
Các hàm hỗ trợ
2
Giới thiệu Winsock
Mô tả giao tiếp socket trong Windows
dựa tên nền tảng của BSD socket
Tồn tại dưới các hàm Windows API
Các hàm cơ bản được chứa trong DLL
3
Các hàm cơ bản được chứa trong DLL
Ứng dụng 16bit: winsock.dll, winsock.lib
Ứng dụng 32bit: wsock32.dll,
wsock32.lib
File header: winsock.h, winsock2.h
Khởi tạo môi trường Winsock
int WSAStartup(WORD wVersionRequested, LPWSADATA
lpWSAData);
Tham số
wVersionRequested: phiên bản Winsock muốn
sử dụng. Có thể sử dụng MAKEWORD(x,y) với
4
sử dụng. Có thể sử dụng MAKEWORD(x,y) với
x.y là phiên bản muốn sử dụng
lpWSAData: là con trỏ, trỏ đến cấu trúc
WSADATA, hàm này sẽ điền thông tin liên quan
đến thư viện
Trả về: 0 nếu thành công
Phiên bản Winsock
Nền Phiên bản
Winsock
Windows 95 1.1
Windows 98 2.2
Windows 2000/XP/03
2.2
5
Windows 2000/XP/03
2.2
Windows 95 2.2
Windows CE 1.1
Ví dụ: WSAStartup(MAKEWORD(2,2),lpWSAData);
Kết thúc Winsock
int WSACleanup(void);
Hàm không có tham số
Giá trị trả về là 0 nếu thành công
6
Mã lỗi có thể nhận bằng hàm:
int WSAGetLastError(void)
Chương trình sử dụng Winsock
#Include <winsock.h>
WSAStartup()
7
WSACleanup()
Mô hình Client/Server hướng kết
nối
socket() socket()
Winsock Server
Winsock Client
8
bind()
listen()
accept()
Address
resolution*
connect()
Address resolution
#define MY_PORT 1001
#denfine SERVER_ADDR “192.16.1.1”
struct sockaddr_in server_addr;
9
server_addr.sin_family = AF_INET;
server_addr.sin_addr.S_addr=inet_addr(SERVER_ADDR);
server_addr.sin_port = htons(MY_PORT);
Các hàm Winsock sử dụng phía
server
Hàm tạo socket:
SOCKET socket(int af,int type,int
protocol)
Tham số:
10
Tham số:
af : họ địa chỉ, thường là AF_INET
type: kiểu socket (SOCK_STREAM,
SOCK_DGRAM)
Trả về : INVALID_SOCKET nếu có lỗi, ngược
lại trả về miêu tả socket mới
Các hàm Winsock sử dụng phía
server(2)
Hàm kết nối socket đến port:
int bind(SOCKET s,const struct sockaddr
FAR* name,int namelen)
Tham số:
11
Tham số:
name : cấu trúc chứa thông tin của cổng giao
tiếp
namelen: độ dài của cấu trúc name
Trả về : SOCK_ERROR nếu có lỗi
Các hàm Winsock sử dụng phía
server(3)
Hàm tạo hàng đợi chờ kết nối đến:
int listen(SOCKET s, int backlog)
Tham số:
s
: socket cần tạo hàng đợi
12
s
: socket cần tạo hàng đợi
backlog: độ dài của hàng đợi
Trả về : giá trị âm nếu có lỗi
Các hàm Winsock sử dụng phía
server(4)
Hàm chấp nhận kết nối đến:
SOCKET accept(SOCKET s,
struct sockaddr FAR* addr,
int FAR* addrlen)
13
int FAR* addrlen)
Tham số:
s : socket lắng nghe kết nối
addr: chứa thông tin địa chỉ IP của máy client
đang yêu cầu kết nối
addrlen: chiều dài của addr
Trả về : socket được kết nối với client
Các hàm Winsock sử dụng phía
client
Hàm tạo socket:
SOCKET socket(int af,int type,int
protocol)
14
(xem hàm tạo socket của Server)
Các hàm Winsock sử dụng phía
client(2)
Hàm tạo kết nối đến server:
int connect(SOCKET s,
struct sockaddr FAR* addr,
int FAR* addrlen)
15
int FAR* addrlen)
Tham số:
s : socket sẽ tạo kết nối
addr: chứa thông tin địa chỉ IP của máy server
cần thực hiện kết nối
addrlen: chiều dài của addr
Trả về : SOCKET_ERROR nếu xảy ra lỗi
Các hàm Winsock sử dụng chung
cho client và server
Hàm gửi dữ liệu:
int send(SOCKET s,const char FAR* buff,
int len,int flags)
Tham số:
16
Tham số:
s : socket đã tạo kết nối để truyền dữ liệu
buff: bộ đệm chứa dữ liệu cần truyền
len: chiều dài của dữ liệu chứa trong buff
flags: thường là 0
Trả về : số lượng byte thật sự đã gửi đi
Các hàm Winsock sử dụng chung
cho client và server
Hàm nhận dữ liệu:
int recv(SOCKET s,const char FAR* buff,
int len,int flags)
Tham số:
17
Tham số:
s : socket đã tạo kết nối để truyền dữ liệu
buff: bộ đệm sẽ chứa dữ liệu
len: số lượng byte muốn nhận, thường là chiều
dài tối đa của buff
flags: thường là 0
Trả về : số lượng byte thật sự đã nhận đi
Các hàm Winsock sử dụng chung
cho client và server
Hàm đóng socket:
int closesocket(SOCKET s)
Tham số:
s
: socket đã tạo kết nối để truyền dữ liệu
18
s
: socket đã tạo kết nối để truyền dữ liệu
Hàm này giải phóng tài nguyên chiếm
dụng bởi mô tả socket s
Mô hình Client/Server hướng không
kết nối
socket() socket()
Winsock Server
Winsock Client
Address
19
bind()
recvfrom()
sendto()/recevfrom()
sendto()
sendto()/recevfrom()
data
data
client addr
Address
resolution*
Các hàm truyền nhận hướng không
kết nối (UDP)
Hàm gửi dữ liệu:
int sendto(SOCKET s,const char FAR* buff,
int len,int flags,
const struct sockaddr FAR* addr,
int addrlen
)
20
int addrlen
)
Tham số:
s : socket cần truyền dữ liệu
buff: bộ đệm chứa dữ liệu cần truyền
len: chiều dài của dữ liệu chứa trong buff
flags: thường là 0
addr: địa chỉ cần gửi
addrlen: chiều dài addr
Trả về : số lượng byte thật sự đã gửi đi
Các hàm truyền nhận hướng không
kết nối (U
DP)
Hàm nhận dữ liệu:
int recvfrom(SOCKET s,const char FAR* buff,
int len,int flags,
const struct sockaddr FAR* addr,
int FAR* addrlen)
Tham số:
21
Tham số:
s : socket cần truyền dữ liệu
buff: bộ đệm chứa dữ liệu sẽ nhận
len: chiều dài của dữ liệu muốn nhận, thường là chiều
dài tối đa của buff
flags: thường là 0
addr: địa chỉ host vừa gửi dữ liệu
addrlen: chiều dài addr
Trả về : số lượng byte thật sự đã nhận