Bài giảng Mạng máy tính - Lập trình Socket - Lê Quốc Hòa
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN
BỘ MÔN MMT & VT – KHOA CNTT
Môn: Mạng máy tính
LẬP TRÌNH SOCKET
ThS. Lê Quốc Hòa
1
Nội dung chính
1
2
Giới thiệu Socket
Hướng dẫn viết 1 ứng dụng S-C
3 Một số hàm cơ bản trong CSocket
4
Demo
2
Giới thiệu về Socket
❖Sockets cung cấp một interface để lập
trình mạng tại tầng Transport.
❖Một socket là một end-point của một liên
kết giữa hai ứng dụng mạng.
❖Nhiều NNLT: C, C++, Java, VB, C#, . . .
❖Windows Socket Application Programming
Interface (Winsock API)
❖Winsock hỗ trợ xây dựng các ứng dụng
mạng trên nền TCP/IP.
3
Nội dung chính
1
2
Giới thiệu Socket
Hướng dẫn viết 1 ứng dụng S-C
3 Một số hàm cơ bản trong CSocket
4
Demo
4
Xây dựng UD Client-Server với Socket
Các bước cần thực hiện:
1. Xác định kiến trúc mạng: Client – Server,
Peer-to-Peer
2. Giao thức sử dụng tầng Transport: TCP,
UDP
3. Các port sử dụng ở Server và Client
4. Giao thức tầng ứng dụng khi trao đổi dữ
liệu giữa hai end-host
5. Lập trình
5
Xây dựng UD Client-Server với Socket
1/ Xác định bài tập và đồ án:
- Kiến trúc Client – Server
- Giao thức sử dụng tầng Transport là TCP
2/ Ghi chú:
- XD UD theo giao thức tầng UD được định
nghĩa sẵn → phải tuân thủ đúng quy định
→ tham khảo RFC (request for comment)
- Peer-to-Peer: 1 UD có cả Client - Server
6
Xây dựng UD Client-Server với Socket
SERVER
CLIENT
Tạo socket để lắng nghe kết nối và
đăng ký port cho socket
Server.Create (port)
Lắng nghe CÁC kết nối từ client
Tạo socket để kết nối đến server
Server.Listen()
Client.Create ()
Đợi 1 kết nối
đến từ Client
Kết nối đến Server
Client.Connect (IP, port)
Chấp nhận 1 kết nối từ client
Server.Accept(s)
Truyền/Nhận dữ liệu với client s
Truyền/Nhận dữ liệu với client s
s.Send() / s.Receive()
Client.Send() / Client.Receive()
Đóng kết nối
Đóng kết nối
Server.Close()
Client.Close()
7
Nội dung chính
1
2
Giới thiệu Socket
Hướng dẫn viết 1 ứng dụng S-C
3 Một số hàm cơ bản trong CSocket
4
Demo
8
Một số hàm cơ bản trong lớp CSocket
❖CSocket (được hỗ trợ trong MFC) quản lý
việc truyền và nhận dữ liệu thông qua
socket
❖Tham khảo trong MSDN:
9
Một số hàm cơ bản trong lớp CSocket
Khởi tạo Socket
BOOL AfxSocketInit(
WSADATA* lpwsaData = NULL
);
❖ Trước khi sử dụng các hàm của lớp CSocket,
chúng ta phải gọi hàm này để khởi tạo Windows
Socket với tham số lpwsaData gán bằng NULL.
10
Một số hàm cơ bản trong lớp CSocket
Tạo socket
BOOL Create(
UINT nSocketPort = 0,
int nSocketType = SOCK_STREAM,
LPCTSTR lpszSocketAddress = NULL
);
❖ nSocketPort: port của socket; nếu bằng 0 thì port sẽ được
MFC chọn ngẫu nhiên.
❖ nSocketType là SOCK_STREAM (TCP) hay SOCK_DGRAM
(UDP).
❖ lpszSocketAddress: địa chỉ IP của host dùng socket. Nếu
dùng NULL, socket sẽ lắng nghe hoạt động của client trên
tất cả các card mạng.
❖ Giá trị trả về: khác 0 nếu thành công; ngược lại thì bằng 0
và mã lỗi cụ thể sẽ được cho khi gọi hàm GetLastError.
11
Một số hàm cơ bản trong lớp CSocket
Lắng nghe các yêu cầu kết nối
BOOL Listen(
int nConnectionBacklog = 5
);
❖ Hàm này chỉ hỗ trợ cho socket dạng
SOCK_STREAM.
❖ nConnectionBacklog: chiều dài tối đa mà hàng
đợi kết nối chưa được chấp nhận có thể tăng.
❖ Giá trị trả về: khác 0 → thành công, bằng 0 →
thất bại.
12
Một số hàm cơ bản trong lớp CSocket
Chấp nhận một kết nối
virtual BOOL Accept(
CAsyncSocket& rConnectedSocket,
SOCKADDR* lpSockAddr = NULL,
int* lpSockAddrLen = NULL );
❖ rConnectedSocket: tham chiếu định danh socket của kết nối
được chấp nhận.
❖ lpSockAddr trỏ đến cấu trúc SOCKADDR nhận địa chỉ IP của
socket kết nối đến.
❖ Nếu lpSockAddr hay lpSockAddrLen lấy giá trị mặc định NULL
thì sẽ không có thông tin từ socket (trên client) được chấp
nhận được trả về.
❖ lpSockAddrlen chứa chiều dài thực sự của lpSockAddr khi trả
về theo byte.
❖ Giá trị trả về: khác 0 nếu thành công và bằng 0 nếu thất bại.
13
Một số hàm cơ bản trong lớp CSocket
Kết nối đến server
BOOL Connect(
LPCTSTR lpszHostAddress,
UINT nHostPort
);
❖ lpszHostAddress: địa chỉ IP của Server.
❖ nHostPort: Port của socket lắng nghe kết nối trên
Server.
❖ Giá trị trả về: khác 0 nếu thành công; ngược lại,
thất bại = 0.
14
Một số hàm cơ bản trong lớp CSocket
Truyền/nhận dữ liệu
virtual int Send/Receive(
const void* lpBuf,
int nBufLen,
int nFlags = 0
);
❖ lpBuf: vùng đệm chứa dữ liệu.
❖ nBuffLen: kích thước của vùng đệm tính theo byte.
❖ nFlag: cách nhận/truyền dữ liệu, sử dụng giá trị mặc
định là 0.
❖ Giá trị trả về là số byte nhận/truyền được
15
Thí dụ minh họa
Bài toán 1: viết một ứng dụng chat tuần tự giữa
Server – Client (Server chat trước).
Xác định 4 bước trước khi lập trình:
1. Xác định kiến trúc mạng: ?
2. Giao thức sử dụng tầng Transport: ?
3. Các port sử dụng ở Server và Client: Server - ?
4. Giao thức tầng ứng dụng khi trao đổi dữ liệu
giữa hai end-host:
+ server → client → server → client → …
+ format thông điệp truyền giữa client và
server: <Chiều dài thông điệp><Thông Điệp>
16
Thí dụ minh họa
Xét kịch bản trong bài toán 1
CLIENT
SERVER
Mô hình: 1 server – 1 client
17
Thí dụ minh họa
Bài toán 2: N clients sẽ gửi cho server 2 số từ 0
→ 10. Các client luân phiên nhau gửi theo 2
lượt. Server đếm số lượng các số Nguyên tố
được gửi lên và thông báo kết quả cho tất cả
client.
Xác định 4 bước trước khi lập trình: ?
• Giao thức tầng ứng dụng khi trao đổi dữ liệu
giữa hai end-host:
+ N clients → server → N clients …
+ format thông điệp truyền giữa client và
server: <Kích thước số nguyên><Số nguyên>
18
Thí dụ minh họa
Xét kịch bản trong bài toán 2
CLIENT 2
CLIENT 1
SERVER
CLIENT 3
Mô hình: 1 server – N clients
19
Nội dung chính
1
2
Giới thiệu Socket
Hướng dẫn viết 1 ứng dụng S-C
3 Một số hàm cơ bản trong CSocket
4
Demo
20
Tải về để xem bản đầy đủ
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Mạng máy tính - Lập trình Socket - Lê Quốc Hòa", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
File đính kèm:
bai_giang_mang_may_tinh_lap_trinh_socket_le_quoc_hoa.ppt