Lập Trình Mạng Với Thư Viện Winsock
Số trang: 4
Loại file: doc
Dung lượng: 4.00 KB
Lượt xem: 10
Lượt tải: 0
Xem trước 2 trang đầu tiên của tài liệu này:
Thông tin tài liệu:
Để 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ínhlà file .cpp đã được biên dịch thành .lib) có tên là ws2_2.lib.
Nội dung trích xuất từ tài liệu:
Lập Trình Mạng Với Thư Viện WinsockLậ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ác prototypes) và 1 file lib (chínhlà 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 khaibáo thư viện của Visual C++.Visual-C++ Code: | Lựa chọn code | Ẩn/Hiện code |#include #include ...#include #pragma comment (lib,ws2_32.lib)Và bây giờ sẽ là những hàm để khởi tạo Winsock:Visual-C++ Code: | Lựa chọn code | Ẩn/Hiện code |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ênbản 2.2. Chúng ta có thể dùng macro MAKEWORD(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ạo Winsock.:Visual-C++ Code: | Lựa chọn code | Ẩn/Hiện code |typedef struct WSAData {WORD wVersion; // Phiên bản hiện tạiWORD wHighVersion; // Phiên bản có thể hỗ trợchar szDescription[WSADESCRIPTION_LEN + 1]; // Ghi chúchar szSystemStatus[WSASYS_STATUS_LEN + 1]; // Trạng thái hệ thốngunsigned short iMaxSockets; // Không sử dụng từ Version 2 trở điunsigned short iMaxUdpDg; // Không sử dụng từ Version 2 trở đichar FAR * lpVendorInfo; // Không sử dụng từ Version 2 trở đi} WSADATA, FAR * LPWSADATA;Và cuối cùng là hàm hủy Winsock khi kết thúc chương trình.Visual-C++ Code: | Lựa chọn code | Ẩn/Hiện code |nt WSACleanup (void);Chương trình đầu tiên:Visual-C++ Code: | Lựa chọn code | Ẩn/Hiện code |#include stdafx.husing namespace std;int _tmain(int argc, _TCHAR* argv[]){WSADATA SData;int iResult = WSAStartup(0x0202,&SData);if (iResult!=0){cout cout 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ông quan trọng mấy vì yêu cầucủa nó là đảm bảo tốc độ nhanh.- Chương trình Chat chẳn hạn.- Hoặc GameOnline (thỉnh thoảng bạn bị trường hợp LAG chính là do bị mất dữ 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ảo giữ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 tay rấ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ầubên gửi gửi tiếp n gói tin tiếp theo, ngược lại thì nó sẽ yêu cầ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ôngmạng” với nhau. Và gói tin mà bạn PING chí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ềunà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àm SOCKET:3. Một số hàm lấy thông tin về mạnga. Lấy thông tin SocketVisual-C++ Code: | Lựa chọn code | Ẩn/Hiện code |int 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ụ:Visual-C++ Code: | Lựa chọn code | Ẩn/Hiện code |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ìnhVisual-C++ Code: | Lựa chọn code | Ẩn/Hiện code |int gethostname(char* name, int namelen);Ví dụ:Visual-C++ Code: | Lựa chọn code | Ẩn/Hiện code |char lpMyPCName[10];gethostbyname(lpMyPCName,10)coutSử dụng inet_addr và inet_ntoa để chuyển đổi qua lại giữa u_long và char*Visual-C++ Code: | Lựa chọn code | Ẩn/Hiện code |u_long YahooAddr = inet_addr(216.109.112.135);cout ...
Nội dung trích xuất từ tài liệu:
Lập Trình Mạng Với Thư Viện WinsockLậ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ác prototypes) và 1 file lib (chínhlà 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 khaibáo thư viện của Visual C++.Visual-C++ Code: | Lựa chọn code | Ẩn/Hiện code |#include #include ...#include #pragma comment (lib,ws2_32.lib)Và bây giờ sẽ là những hàm để khởi tạo Winsock:Visual-C++ Code: | Lựa chọn code | Ẩn/Hiện code |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ênbản 2.2. Chúng ta có thể dùng macro MAKEWORD(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ạo Winsock.:Visual-C++ Code: | Lựa chọn code | Ẩn/Hiện code |typedef struct WSAData {WORD wVersion; // Phiên bản hiện tạiWORD wHighVersion; // Phiên bản có thể hỗ trợchar szDescription[WSADESCRIPTION_LEN + 1]; // Ghi chúchar szSystemStatus[WSASYS_STATUS_LEN + 1]; // Trạng thái hệ thốngunsigned short iMaxSockets; // Không sử dụng từ Version 2 trở điunsigned short iMaxUdpDg; // Không sử dụng từ Version 2 trở đichar FAR * lpVendorInfo; // Không sử dụng từ Version 2 trở đi} WSADATA, FAR * LPWSADATA;Và cuối cùng là hàm hủy Winsock khi kết thúc chương trình.Visual-C++ Code: | Lựa chọn code | Ẩn/Hiện code |nt WSACleanup (void);Chương trình đầu tiên:Visual-C++ Code: | Lựa chọn code | Ẩn/Hiện code |#include stdafx.husing namespace std;int _tmain(int argc, _TCHAR* argv[]){WSADATA SData;int iResult = WSAStartup(0x0202,&SData);if (iResult!=0){cout cout 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ông quan trọng mấy vì yêu cầucủa nó là đảm bảo tốc độ nhanh.- Chương trình Chat chẳn hạn.- Hoặc GameOnline (thỉnh thoảng bạn bị trường hợp LAG chính là do bị mất dữ 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ảo giữ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 tay rấ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ầubên gửi gửi tiếp n gói tin tiếp theo, ngược lại thì nó sẽ yêu cầ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ôngmạng” với nhau. Và gói tin mà bạn PING chí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ềunà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àm SOCKET:3. Một số hàm lấy thông tin về mạnga. Lấy thông tin SocketVisual-C++ Code: | Lựa chọn code | Ẩn/Hiện code |int 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ụ:Visual-C++ Code: | Lựa chọn code | Ẩn/Hiện code |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ìnhVisual-C++ Code: | Lựa chọn code | Ẩn/Hiện code |int gethostname(char* name, int namelen);Ví dụ:Visual-C++ Code: | Lựa chọn code | Ẩn/Hiện code |char lpMyPCName[10];gethostbyname(lpMyPCName,10)coutSử dụng inet_addr và inet_ntoa để chuyển đổi qua lại giữa u_long và char*Visual-C++ Code: | Lựa chọn code | Ẩn/Hiện code |u_long YahooAddr = inet_addr(216.109.112.135);cout ...
Tìm kiếm theo từ khóa liên quan:
thủ thuật máy tính công nghệ thông tin tin học quản trị mạng computer networkTài liệu liên quan:
-
52 trang 434 1 0
-
24 trang 359 1 0
-
Top 10 mẹo 'đơn giản nhưng hữu ích' trong nhiếp ảnh
11 trang 321 0 0 -
Làm việc với Read Only Domain Controllers
20 trang 312 0 0 -
74 trang 304 0 0
-
96 trang 299 0 0
-
Báo cáo thực tập thực tế: Nghiên cứu và xây dựng website bằng Wordpress
24 trang 292 0 0 -
Đồ án tốt nghiệp: Xây dựng ứng dụng di động android quản lý khách hàng cắt tóc
81 trang 286 0 0 -
EBay - Internet và câu chuyện thần kỳ: Phần 1
143 trang 277 0 0 -
Tài liệu hướng dẫn sử dụng thư điện tử tài nguyên và môi trường
72 trang 270 0 0