Lập trình Windows với MFC Microsoft Visual C++ 6.0 Lê Ngọc Thạn h lntmail@yahoo.com Socket là điểm truyền thông đầu cuối cho phép ứng dụng gửi và nhận các

Một phần của tài liệu lập trình windows với MFC (Trang 109)

Socket là điểm truyền thông đầu cuối cho phép ứng dụng gửi và nhận các packet qua đường truyền mạng. Mỗi socket có một kiểu xác định và gắn liền với một tiến trình xử lý truyền thông. Có hai loại socket:

ƒ Stream Socket: Cơ chế truyền dữ liệu theo dòng.

ƒ Datagram Socket: Cơ chế truyền dữ liệu theo packet.

) Địa chỉ socket là một giá trị bao gồm địa chỉ của host và số hiệu port mà tiến trình xử lý truyền thông liên quan socket đã đăng ký sử dụng. 13.2.3 Một số cấu trúc dữ liệu của Winsock API:

ƒ Địa chỉ num-dot của host:

Được biểu diễn bởi một giá trị chuỗi có nội dung là bốn giá trị số có độ lớn bằng byte và được ngăn cách bằng dấu ‘.’

Ví dụ: "127.0.0.1"

ƒ Cấu trúc khởi động winsock : typedef struct WSAData { WORD wVersion;

WORD wHighVersion;

char szDescription[WSADESCRIPTION_LEN+1];

char szSystemStatus[WSASYS_STATUS_LEN+1];

unsigned short iMaxSockets;

unsigned short iMaxUdpDg;

char FAR * lpVendorInfo;

} WSADATA, *LPWSADATA;

szDescription: Thông tin về phiên bản winsock đang sử dụng. szSystemStatus: Thông tin về phiên bản hệ điều hành windows.

ƒ Cấu trúc chứa thông tin của host : struct hostent {

char FAR * h_name; // Domain name

char FAR * FAR * h_aliases; // Tên dùng thay domain name short h_addrtype; // Kiểu địa chỉ, với TCP/IP là AF_INET short h_length; // Kích thước địa chỉ, 4 bytes cho AF_INET char FAR * FAR * h_addr_list; // Danh sách địa chỉ. Phần tử // đầu danh sách h_addr_list[0] // (hay h_addr) là địa chỉ host. } HOSTENT, *PHOSTENT;

ƒ Địa chỉ socket trên một host: struct sockaddr {

MFC với Internet 199

unsigned short sa_family; // Họ địa chỉ của host.

char sa_data[14]; // Địa chỉ (cho phép nhiều loại địa chỉ) } SOCKADDR ;

Cấu trúc này được tương thích bởi SOCKADDR_IN của MicroSoft: struct sockaddr_in {

short sin_family; // Có giá trị là AF_INET unsigned short sin_port; // Số hiệu port

struct in_addr sin_addr; // Địa chỉ IP 4 bytes của host

char sin_zero[8]; // Chỉ để tương thích với SOCKADDR } SOCKADDR_IN ;

sin_addr : Địa chỉ IP 4 bytes của host, có các cách diễn tả như sau: struct in_addr {

union { struct {

unsigned char s_b1, s_b2, s_b3, s_b4;

} S_un_b; // Địa chỉ IP bằng 4 bytes struct { (adsbygoogle = window.adsbygoogle || []).push({});

unsigned short s_w1, s_w2;

} S_un_w; // Địa chỉ IP bằng 2 words unsigned long S_addr; // Địa chỉ IP bằng 1 long } S_un;

};

13.2.4 Một số dịch vụ của Winsock API:

ƒ char FAR * inet_ntoa (

struct in_addr in // Địa chỉ IP 4 bytes ); Trả về chuỗi địa chỉ num-dot tương ứng.

ƒ unsigned long inet_addr (

const char FAR *cp // Địa chỉ IP num-dot

); Hàm trả về giá trị kiểu long của địa chỉ IP 4 bytes tương ứng.

ƒ int WSAStartup ( // Hàm trả về giá trị 0 nếu thành công WORD version, // Phiên bản winsock

LPWSADATA pMyInfo // Con trỏ cấu trúc nhận thông tin. ); Khởi động, chuẩn bị cho việc khai thác các dịch vụ của winsock. version: Chứa số hiệu phiên bản winsock cần dùng

- High-order byte = winsock minor version number.

200 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com- Low-order byte = winsock major version number. - Low-order byte = winsock major version number.

- Ví dụ: MAKEWORD (1, 1 ) Ỉ Winsock version 1.1.

ƒ int gethostname ( // Hàm trả về SOCKET_ERROR nếu có lỗi char FAR *name, // Vùng đệm chứa thông tin

int namelen // Kích thước vùng đệm ); Lấy thông tin về tên của host.

ƒ PHOSTENT gethostbyname (

const char FAR *name // Tham số chứa tên host

); Hàm trả về con trỏ đến cấu trúc HOSTENT chứa thông tin của host.

ƒ int WSACleanup( ); Chấm dứt sử dụng dịch vụ winsock. 13.3 MFC VỚI LẬP TRÌNH WINSOCK:

Thư viện sử dụng: AfxSock.h 13.3.1 Khởi động Winsock:

BOOL AfxSocketInit ( WSADATA* lpwsaData = NULL );

) AfxSocketInit đảm nhận việc thực hiện WSAStartup khi bắt đầu ứng dụng và WSACleanup khi ứng dụng kết thúc. Lời gọi AfxSocketInit được thực hiện trong hành vi InitInstance của đối tượng quản lý tiểu trình chính của ứng dụng. Tham số truyền cho hàm có ý nghĩa như với WSAStartup. 13.3.2 Lớp CAsyncSocket:

CAsyncSocket là lớp đối tượng quản lý socket. Bằng sự bao hàm các dịch vụ của winsock API trong các hành vi, lớp CAsyncSocket cho phép tạo ra đối tượng socket hỗ trợ ứng dụng một cách hiệu quả trong việc triển khai các hoạt động truyền thông trên tầng truyền tải của giao thức TCP/IP.

Các hành vi đặc trưng lớp CAsyncSocket như sau:

ƒ CAsyncSocket( ); Khởi tạo đối tượng socket rỗng.

ƒ BOOL Create (

UINT nSocketPort = 0,

int nSocketType = SOCK_STREAM,

long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE, LPCTSTR lpszSocketAddress = NULL (adsbygoogle = window.adsbygoogle || []).push({});

); Khởi tạo thông số đối tượng socket và kết với host đối tác (nếu có). Trong đó:

- nSocketPort : Số hiệu port của socket. Giá trị này có thể xác định bởi người dùng (ví dụ 2050) hoặc đặt bằng 0 để winsock tìm giúp một giá trị phù hợp.

MFC với Internet 201

- n SocketType : Ấn định giao thức sử dụng; SOCK_STREAM cho TCP hoặc SOCK_DGRAM cho UDP.

- lEvent : Bao gồm các thông số liên quan đến các biến cố truyền thông mà ứng dụng muốn winsock phản hồi ngay trên socket quản lý bởi đối tượng socket. FD_READ : Nhận được thông tin. FD_WRITE : Gửi được thông tin. FD_ACCEPT : Đồng ý kết nối. FD_CONNECT : Đề nghị kết nối. FD_CLOSE : Chấm dứt kết nối. FD_OOB : Thông tin ngoài tuyến.

- lpszSocketAddress : Chuỗi chứa địa chỉ num-dot của host đối tác mà socket được kết (bind). INADDR_ANY là địa chỉ dùng kết với tất cả các host trong hệ thống mạng.

ƒ BOOL Bind (

UINT nSocketPort, // Số hiệu port

LPCTSTR lpszSocketAddress = NULL // Địa chỉ num-dot của host ); Kết socket với một host xác định.

ƒ BOOL Bind (

const SOCKADDR* lpSockAddr, // Địa chỉ socket host đối tác int nSockAddrLen // Kích thước lpSockAddr ); Kết socket với một host xác định.

ƒ BOOL SetSockOpt (

int nOptionName, // Thuộc tính cần ấn định

const void* lpOptionValue, // Địa chỉ biến chứa giá trị ấn định int nOptionLen, // Kích thước biến chứa giá trị

Một phần của tài liệu lập trình windows với MFC (Trang 109)