TRƯỜNG CAO ĐẲNG NGHỀ ĐỒNG THÁP
KHOA CÔNG NGHỆ THÔNG TIN
---------
Bài giảng:
CÁC PHƯƠNG PHÁP XUẤT NHẬP WINSOCK
I. Cài đặt Winsock
Các file cần thiết :
WINSOCK.DLL hay WSOCK32.DLL ( tuỳ version 16 hay 32 bit của Windows ).
WINSOCK.LIB hay WSOCK32.LIB.
WINSOCK.H.
Giới thiệu một số hàm của WinSock:
Dưới đây chỉ giới thiệu chức năng của một số hàm WinSock, không trình bày prototype của các hàm
Các hàm khởi động WinSock :
Dùng để khởi đầu và kết thúc quá trình sử dụng WinSock.
WSAStartup() : Khởi động WinSock.
WSACleanup() : Kết htúc WinSock.
WSAGetLastError() : Lấy mã sai vừa xảy ra.
II. CƠ BẢN VỀ SỬ LÝ MÁY KHÁCH/CHỦ(CLIENT/SERVER)
-
Ứng dụng Client - Server là gì?
Trước tới giờ, các bạn lập trình với mục đích là tạo ra được một ứng dụng. Nhưng ứng dụng đó chỉ hoạt động độc lập 1 mình riêng lẽ.
Mục tiêu lập trình mạng sẽ đưa ra những ứng dụng dạng Client – Server. Tức là sẽ có 2 loại ứng dụng chính đó là Client và Server.
Quy trình hoạt động của ứng dụng Server – Client như sau:
- Server có nhiệm vụ của là lắng nghe, chờ đợi kết nối từ Client trên địa chỉ IP của mình với PORT được quy định sẵn. Khi client gởi dữ liệu tới Server thì nó phải giải quyết một công việc là nhận dữ liệu đó -> xử lý -> trả kết quả lại cho Client.
-
Client là ứng dụng được phục vụ, nó chỉ gởi truy vấn và chờ đợi kết quả từ Server.
Trong mô hình TCP/IP có 2 giao thức là TCP và UDP và 2 giao thức này sẽ quyết định cách thức hoạt động của Client - Server như thế nào?
-
Hoạt động của Client – Server trong giao thức TCP (SOCK_STREAM)
-
Hoạt động của Client – Server trong giao thức UDP (SOCK_DGRAM)
II. Các hàm API Winsock
-
BIND
int bind(SOCKET s, const struct sockaddr FAR* name, int namelen);
Tác dụng dụng của BIND là sẽ giúp cho SOCKET của SERVER biết rằng nó sẽ chờ đợi kết nối và nhận dữ liệu trên IP nào và PORT bao nhiêu?
PORT nên chọn ở đây nên ở trong khoảng nào:
- 0 -1023: Là những PORT đã được sử dụng bởi các dịch vụ như WEB, FTP, …
- 1024-49151: Là PORT dành cho SERVER lắng nghe. SERVER nên chọn trong khoảng này.
- 49152-65535: Là PORT khởi tạo ngẫu nhiên dành cho CLIENT kết nối tới Server.
Hàm Bind gồm có 3 thông số:
- SOCKET s: Socket được thiết lập
- sockaddr name: Cấu trúc ADDR bao gồm địa chỉ IP và PORT
- int namelen: Kích thước của cấu trúc sockaddr
Ví dụ:
#define MYPORT 12345
// Chọn giao thức TCP
SOCKET sockfd = socket(AF_INET, SOCK_STREAM, 0);
// Thiết lập IP
sockaddr_in my_addr;
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(MYPORT);
my_addr.sin_addr.s_addr = INADDR_ANY;
// Đưa IP và PORT vào SOCKET
bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));
b. LISTEN
int listen(SOCKET s, int backlog);
Kể từ khi gọi hàm này thì SERVER sẽ bắt đầu lắng nghe kết nối của mình.
Hàm LISTEN gồm có 2 thông số:
- SOCKET s: Socket đã được thiết lập IP và PORT.
- int backlog: Số kết nối cho phép chờ trong hàng đợi khi Server chưa chấp nhận kết nối. (vì đôi lúc có thể có tới 2 hay 3 client kết nối tới cùng 1 lúc). Giá trị tốt nhất là khoảng từ 5 – 10.
c. CONNECT
int connect(SOCKET s,
struct sockaddr *serv_addr, int addrlen );
Hàm được gọi từ CLIENT nếu nó muốn kết nối tới SERVER
- SOCKET s: Socket đã được khởi tạo.
- sockaddr *serv_addr: IP và PORT của Server.
- int addrlen: Sizeof của cấu trúc sockaddr.
d. ACCEPT
SOCKET accept(SOCKET s, struct sockaddr FAR* addr, int FAR* addrlen);
Khi Client kết nối tới Server. Nó phải chờ Server chấp nhận kết nối (nếu ở giao thức TCP) bằng hàm accept trên.
Hàm ACCEPT gồm có 2 thông số:
- SOCKET s: Socket lắng nghe của SERVER.
- sockaddr addr: Là cấu trúc sockaddr lưu địa chỉ IP và PORT của CLIENT kết nối tới SERVER.
- int addrlen: Kích thước cấu trúc địa chỉ IP này.
Hàm ACCPET trả về 1 SOCKET mới
Socket mới được tạo này đại diện cho 1 Connection (kết nối) mới giữa Server và Client. Sau khi đã truyền dữ liệu thì ta phải đóng SOCKET này lại bằng hàm close như closesocket(connect);
e. REVC/SEND
* Nhận dữ liệu trên giao thức TCP
int recv(SOCKET s, char FAR* buf, int len, int flags);
* Gửi dữ liệu giao thức TCP
int send(SOCKET s, const char FAR * buf, int len, int flags);
- SOCKET s: Là SOCKET được tạo ra khi Server chấp nhận kết nối từ CLIENT
- char FAR* buf: Là dữ liệu (dạng BYTE – char) nhận hay gửi.
- int len: Kích thước của dữ liệu.
- int flags: Một số cờ hiệu đi kèm (thông thường là 0).
f. REVCFROM/SENDTO
Được sử dụng trên giao thức UDP
int recvfrom(SOCKET s,char FAR* buf,int len,int flags,struct sockaddr *from,int *fromlen);
Các thông số:
- SOCKET s: Là SOCKET được tạo ra ban đầu.
- char FAR* buf: Là dữ liệu (dạng BYTE – char) nhận
- int len: Kích thước của dữ liệu nhận.
- int flags: Một số cờ hiệu đi kèm (thông thường là 0).
- sockaddr *from: IP và PORT từ bên gửi.
- int *fromlen: Sizeof cấu trúc addr.
int sendto(SOCKET s,
const char FAR *buf,int len,int flags,const struct sockaddr* to,int tolen);
- SOCKET s: Là SOCKET được tạo ra ban đầu.
- char FAR* buf: Là dữ liệu (dạng BYTE – char) gửi
- int len: Kích thước của dữ liệu gửi.
- int flags: Một số cờ hiệu đi kèm (thông thường là 0).
- sockaddr *to: IP và PORT tới bên nhận.
- int tolen: Sizeof cấu trúc addr.
g. CLOSE/SHUTDOWN
int shutdown(SOCKET s, int how);
int closesocket (SOCKET s);
Hủy SOCKET sau một kết nối hoặc kết thúc chương trình.
Tham số how của shutdown:
- SD_RECEIVE: Đóng SOCKET, không cho phép NHẬN nhưng cho phép GỬI.
- SD_SEND: Đóng SOCKET, không cho phép GỬI nhưng cho phép NHẬN.
- SD_BOTH: Không cho GỬI và NHẬN (giống gọi hàm closesocket).
Trang
Chia sẻ với bạn bè của bạn: |