Download as pdf or txt
Download as pdf or txt
You are on page 1of 6

Nội dung

Chương 3  Giới thiệu Winsock


 BSD socket trong Windows
 Các hàm hỗ trợ
LẬP TRÌNH WINSOCK
(Windows Socket)

1 2

Giới thiệu Winsock Khởi tạo môi trường Winsock


int WSAStartup(WORD wVersionRequested, LPWSADATA
 Mô tả giao tiếp socket trong Windows lpWSAData);
dựa tên nền tảng của BSD socket  Tham số
 Tồn tại dưới các hàm Windows API  wVersionRequested: phiên bản Winsock muốn
sử dụng. Có thể sử dụng MAKEWORD(x,y) với
 Các hàm cơ bản được chứa trong DLL x.y là phiên bản muốn sử dụng
 Ứng dụng 16bit: winsock.dll, winsock.lib  lpWSAData: là con trỏ, trỏ đến cấu trúc
 Ứng dụng 32bit: wsock32.dll, WSADATA, hàm này sẽ điền thông tin liên quan
wsock32.lib đến thư viện
 Trả về: 0 nếu thành công
 File header: winsock.h, winsock2.h

3 4
Phiên bản Winsock Kết thúc Winsock
Nền Phiên bản int WSACleanup(void);
Winsock
 Hàm không có tham số
Windows 95 1.1
Windows 98 2.2  Giá trị trả về là 0 nếu thành công
Windows 2000/XP/03 2.2
Windows 95 2.2  Mã lỗi có thể nhận bằng hàm:
Windows CE 1.1 int WSAGetLastError(void)

Ví dụ: WSAStartup(MAKEWORD(2,2),lpWSAData);

5 6

Mô hình Client/Server hướng kết


Chương trình sử dụng Winsock nối
Winsock Server Winsock Client
#Include <winsock.h>

socket() socket()
WSAStartup()

bind()
... Address
... resolution*
... listen()

accept() connect()
WSACleanup()

7 8
Các hàm Winsock sử dụng phía
Address resolution server
#define MY_PORT 1001
#denfine SERVER_ADDR “192.16.1.1”
 Hàm tạo socket:
SOCKET socket(int af,int type,int
struct sockaddr_in server_addr; protocol)
 Tham số:
server_addr.sin_family = AF_INET;
 af : họ địa chỉ, thường là AF_INET
server_addr.sin_addr.S_addr=inet_addr(SERVER_ADDR);
server_addr.sin_port = htons(MY_PORT);  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

9 10

Các hàm Winsock sử dụng phía Các hàm Winsock sử dụng phía
server(2) server(3)
 Hàm kết nối socket đến port:  Hàm tạo hàng đợi chờ kết nối đến:
int bind(SOCKET s,const struct sockaddr int listen(SOCKET s, int backlog)
FAR* name,int namelen)  Tham số:
 Tham số:  s : socket cần tạo hàng đợi
 name : cấu trúc chứa thông tin của cổng giao  backlog: độ dài của hàng đợi
tiếp  Trả về : giá trị âm nếu có lỗi
 namelen: độ dài của cấu trúc name
 Trả về : SOCK_ERROR nếu có lỗi

11 12
Các hàm Winsock sử dụng phía Các hàm Winsock sử dụng phía
server(4) client
 Hàm chấp nhận kết nối đến:  Hàm tạo socket:
SOCKET accept(SOCKET s, SOCKET socket(int af,int type,int
struct sockaddr FAR* addr, protocol)
int FAR* addrlen)
 Tham số: (xem hàm tạo socket của Server)
 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
13 14

Các hàm Winsock sử dụng phía Các hàm Winsock sử dụng chung
client(2) cho client và server
 Hàm tạo kết nối đến server:  Hàm gửi dữ liệu:
int connect(SOCKET s, int send(SOCKET s,const char FAR* buff,
struct sockaddr FAR* addr, int len,int flags)
int FAR* addrlen)  Tham số:
 Tham số:  s : socket đã tạo kết nối để truyền dữ liệu
 s : socket sẽ tạo kết nối  buff: bộ đệm chứa dữ liệu cần truyền
 addr: chứa thông tin địa chỉ IP của máy server  len: chiều dài của dữ liệu chứa trong buff
cần thực hiện kết nối  flags: thường là 0
 addrlen: chiều dài của addr  Trả về : số lượng byte thật sự đã gửi đi
 Trả về : SOCKET_ERROR nếu xảy ra lỗi
15 16
Các hàm Winsock sử dụng chung Các hàm Winsock sử dụng chung
cho client và server cho client và server
 Hàm nhận dữ liệu:  Hàm đóng socket:
int recv(SOCKET s,const char FAR* buff, int closesocket(SOCKET s)
int len,int flags)  Tham số:
 Tham số:  s : socket đã tạo kết nối để truyền dữ liệu
 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
 buff: bộ đệm sẽ chứa dữ liệu dụng bởi mô tả socket s
 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

17 18

Mô hình Client/Server hướng không Các hàm truyền nhận hướng không
kết nối kết nối (UDP)
Winsock Server Winsock Client  Hàm gửi dữ liệu:
int sendto(SOCKET s,const char FAR* buff,
socket() socket() int len,int flags,
const struct sockaddr FAR* addr,
Address
int addrlen)
bind()  Tham số:
resolution*
 s : socket cần truyền dữ liệu
data  buff: bộ đệm chứa dữ liệu cần truyền
recvfrom() sendto()
client addr  len: chiều dài của dữ liệu chứa trong buff
 flags: thường là 0
sendto()/recevfrom()  addr: địa chỉ cần gửi
sendto()/recevfrom()
data  addrlen: chiều dài addr
 Trả về : số lượng byte thật sự đã gửi đi

19 20
Các hàm truyền nhận hướng không
kết nối (UDP)
 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ố:
 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

21

You might also like