Danh mục

[VC++] Lập Trình Mạng Với Thư Viện Winsock

Số trang: 37      Loại file: pdf      Dung lượng: 685.51 KB      Lượt xem: 18      Lượt tải: 0    
10.10.2023

Xem trước 4 trang đầu tiên của tài liệu này:

Thông tin tài liệu:

I. KHỞI ĐỘNG WINSOCK Để lập trình được Winsock chúng ta sẽ khai báo thư viện winsock2.h (chứa các prototypes) và 1 file lib (chính là file .cpp đã được biên dịch thành .lib) có tên là ws2_2.lib. Bây giờ hãy tạo 1 project Windows32 Console Project. Lưu ý: Chúng ta không khai báo trong file .cpp có hàm main mà khai báo trong file stdafx.h. Đây là cách khai báo thư viện của Visual C++. #include ... #include #pragma comment (lib,"ws2_32.lib") Và bây giờ sẽ là những hàm để khởi tạo Winsock: int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);...
Nội dung trích xuất từ tài liệu:
[VC++] Lập Trình Mạng Với Thư Viện Winsock[VC++] Lập Trình Mạng Với Thư Viện Winsock [VC++] Lập Trình Mạng Với Thư Viện WinsockI. KHỞI ĐỘNG WINSOCKĐể lập trình được Winsock chúng ta sẽ khai báo th ư viện winsock2.h (chứa cácprototypes) và 1 file lib (chính là file .cpp đã được biên dịch thành .lib) có tênlà ws2_2.lib.Bây giờ hãy tạo 1 project Windows32 Console Project.Lưu ý: Chúng ta không khai báo trong file .cpp có hàm main mà khai báo trongfile stdafx.h. Đây là cách khai báo thư viện của Visual C++.#include ...#include #pragma comment (lib,ws2_32.lib)Và bây giờ sẽ là những hàm để khởi tạo Winsock:int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);Trong đó:- wVersionRequested là phiên bản thư viện mà mình sử dụng. Ở đây sẽ là giátrị 0x0202 có nghĩa là phiên bản 2.2. Chúng ta có thể dùng macroMAKEWORD(2,2) để trả về giá trị 0x0202.- lpWSData là m ột số thông tin bổ sung sẽ đ ược trả về sau khi gọi khởi tạoWinsock.:typedef struct WSAData { // Phiên bản hiện tại WORD wVersion; wHighVersion; // Phiên bản có thể hỗ trợ WORD char szDescription[WSADESCRIPTION_LEN + 1]; // Ghi chú szSystemStatus[WSASYS_STATUS_LEN + 1]; // Tr ạng thái hệ charthống unsigned short iMaxSockets; // Không s ử dụng từ Version 2 trở đi // Không s ử dụng từ Version 2 trở đi unsigned short iMaxUdpDg; lpVendorInfo; // Không s ử dụng từ Version 2 trở đi char FAR *} WSADATA, FAR * LPWSADATA;Và cuối cùng là hàm hủy Winsock khi kết thúc ch ương trình.nt WSACleanup (void);Chương trình đầu tiên:#include stdafx.husing namespace std;int _tmain(int argc, _TCHAR* argv[]){ WSADATA SData; int iResult = WSAStartup(0x0202,&SData); if (iResult!=0){ cout dùng địa chỉ IP để truyền dữliệu)- AF_NETBIOS: NetBIOS (Giao th ức dùng tên máy để truyền dữ liệu)- AF_APPLETALK: AppleTalk- AF_ATM: ATM…Và ở trong Tut này mình chỉ nghiên cứu tới TCP/IP.* type: Quy định giao thức vận chuyển dữ liệuVí dụ với giao thức TCP/IP thì có 2 giao thức cốt lõi là UDP và TCP:- SOCK_DGRAM: Hay là giao th ức UDP. Khi chương trình chúng ta dùngUDP để truyền dữ liệu thì chuyện gì sẽ xảy ra giữa bên gởi và bên nhận? Bêngửi cứ gửi và gửi và nó không hề quan tâm tới vấn đề bên nhận có nhận đượcnó hay không?=> Ưu điểm: Tốc độ truyền dữ liệu nhanh.=> Nhược điểm: Khả năng sai, mất dữ liệu sẽ rất lớn.Vậy dùng UDP khi nào? Những ứng dụng cần dữ liệu tức thời nh ư:- Chương trình nghe nhạc trực tuyến. Vấn đề sai bit (vấp khi nghe nhạc) khôngquan trọng mấy vì yêu cầu của nó l à đảm bảo tốc độ nhanh.- Chương trình Chat c hẳn hạn.- Hoặc GameOnline (thỉnh thoảng bạn bị tr ường hợp LAG chính là do bị mấtdữ liệu trên đường truyền đó)- SOCK_STREAM: Đây là giao th ức TCP. Nó ngược với UDP vì nó đảm bảogiữa bên gửi và bên nhận dữ liệu phải chính xác. Vì vậy 2 bên sẽ phải bắt tayrất nhiều lần khi truyền đ ược dữ liệu (ví dụ như bên gửi sẽ gửi n gói tin(packet), bên nhận sẽ kiểm tra có bị mất hay sai gói tin nào hay không, nếu đủthì nó sẽ yêu cầu bên gửi gửi tiếp n gói tin tiếp theo, ng ược lại thì nó sẽ yêucầu gửi lại)=> Ưu điểm: Chất lượng gởi tin cậy.=> Nhược điểm: Chậm hơn UDP.Những ứng dụng như WEB, MAIL, FTP,…- SOCK_RAW:Là giao thức để kiểm soát mạng, kiểm tra kết nối…Ví dụ:Start -> Run -> CMD: “ping diendantinhoc.com”.Nếu bạn nhận được Reply có nghĩa là giữa máy tính của bạn với máy chủ“diendantinhoc.com” có “thông mạng” với nhau. Và gói tin mà bạn PINGchính là SOCK_RAW (ICMP Packet)* protocol: Chỉ định rõ lại giao thức mà thôi. Vì SOCK_RAW có 2 protocol làICMP và RAW nên nó cần điều này- SOCK_DGREAM -> protocol là: IPPROTO_UDP- SOCK_STREAM -> protocol là: IPPROTO_IP- SOCK_RAW -> protocol có thể là: IPPROTO_RAW hay IPPROTO_ICMPCác bạn có thể tham khảo thêm bảng thể hiện các thuộc tính của hàmSOCKET:3. Một số hàm lấy thông tin về mạnga. Lấy thông tin Socketint WSAEnumProtocols ( LPINT lpiProtocols, LPWSAPROTOCOL_INFO lpProtocolBuffer, LPDWORD lpdwBufferLength);lpiProtocols: NULLlpProtocolBuffer: Ki ểu dữ liệu trả vềlpdwBufferLength: Kích thước của kiểu dữ liệuTuy nhiên việc sử dụng hàm này còn hơi rườm rà.Ví dụ: WSAEnumProtocols(NULL,NULL,&size); // -> Lấy kích thước kiểu dữ liệuWSAPROTOCOL_INFO *lpProtocolBuffer;lpProtocolBuffer = (WSAPROTOCOL_INFO*) malloc(size);WSAEnumProtocols(NULL, lpProtocolBuffer,&size);b. Lấy tên máy tính c ủa mìnhint gethostname(char* name, int namelen);Ví dụ:char lpMyPCName[10];gethostbyname(lpMyPCName,10)coutTrong đó typedef struct hostent { char FAR* h_name; // Tên máy tính char FAR FAR** h_aliases; // Bí danh máy tính // Kiểu IP (AF_INET) short h_addrtype; short h_length; // Kích thư ớc IP char FAR FAR** h_addr_list; // Danh sách c ác địa ...

Tài liệu được xem nhiều: