1. Trang chủ
  2. » Công Nghệ Thông Tin

Tài liệu Lập Trình Mạng Với Thư Viện Winsock ppt

4 747 5
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Network Programming With Winsock Library
Thể loại PowerPoint Presentation
Định dạng
Số trang 4
Dung lượng 51,5 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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

Trang 1

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

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++

Visual-C++ Code: | Lựa chọn code | Ẩn/Hiện code |

#include <stdio.h>

#include <tchar.h>

#include <winsock2.h>

#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ên bả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ại

WORD 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ống

unsigned short iMaxSockets; // Không sử dụng từ Version 2 trở đi

unsigned short iMaxUdpDg; // Không sử dụng từ Version 2 trở đi

char 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.h"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{

WSADATA SData;

int iResult = WSAStartup(0x0202,&SData);

if (iResult!=0){

cout << "KHONG THE KHOI DONG WINSOCK";

return 1;

}

cout << "KHOI TAO SOCKET THANH CONG: \n";

cout << "Phien ban: "<< SData.wVersion << "\n";

cout << "Phien ban co the ho tro: "<< SData.wHighVersion << "\n";

cout << "Ghi chu: " << SData.szDescription << "\n";

Trang 2

cout << "Thong tin cau hinh: " << SData.szSystemStatus << "\n";

WSACleanup();

return 0;

}

II SOCKET

1 Socket là gì?

“Socket là một cổng logic mà một chương trình sử dụng để kết nối với một chương trình khác chạy trên một máy tính khác trên Internet Chương trình mạng có thể sử dụng nhiều Socket cùng một lúc, nhờ đó nhiều chương trình có thể sử dụng Internet cùng một lúc.”

Ở đây ta hiểu Socket trong Winsock như là một “phương tiện” để ứng dụng mạng có thể trao đổi dữ liệu Nghĩa là 1 Server thì sẽ cần một Socket để lắng nghe, chờ đợi các kết nối từ client và Client thì phải cần có một Socket để kết nối tới Sever

2 Khởi tạo Socket

Chúng ta sử dụng cấu trúc SOCKET để lưu giữ 1 Socket Và có thể sử dụng hàm sau đây để tạo Socket Visual-C++ Code: | Lựa chọn code | Ẩn/Hiện code |

SOCKET socket (

int af,

int type,

int protocol

);

Ví dụ:

Visual-C++ Code: | Lựa chọn code | Ẩn/Hiện code |

SOCKET s = socket(AF_INET,SOCK_STREAM,IPPROTO_IP);

Trong đó:

* af: Là một con số ID để quyết định Socket của chúng ta sử dụng giao thức (protocol) để kết nối

- AF_INET : TCP/IP (Phổ biến nhất hiện nay -> 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ệu

Ví 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ùng UDP để 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ên gử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 được nó 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ông quan trọng mấy vì yêu cầu củ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ầu bê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,…

Trang 3

- 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 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ề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_ICMP

Cá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ạng

a Lấy thông tin Socket

Visual-C++ Code: | Lựa chọn code | Ẩn/Hiện code |

int WSAEnumProtocols (

LPINT lpiProtocols,

LPWSAPROTOCOL_INFO lpProtocolBuffer,

LPDWORD lpdwBufferLength

);

lpiProtocols: NULL

lpProtocolBuffer: Kiểu dữ liệu trả về

lpdwBufferLength: Kích thước của kiểu dữ liệu

Tuy 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ệu

WSAPROTOCOL_INFO *lpProtocolBuffer;

lpProtocolBuffer = (WSAPROTOCOL_INFO*) malloc(size);

WSAEnumProtocols(NULL, lpProtocolBuffer,&size);

b Lấy tên máy tính của mình

Visual-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)

cout<< lpMyPCName;

c Làm việc với IP

“Mình sẽ đi nhanh và giới thiệu sơ qua về phần này Ở phần Địa Chỉ Mạng sắp tới mình sẽ nói rõ hơn IP” Địa chỉ IP là 1 con số 4 byte để xác định 1 host trên mạng

Ví dụ: “192.168.11.1” [Byte1: 192] [Byte2: 168][ [Byte3: 11][ [Byte4: 1]

Có thể biểu diễn địa chỉ IP: unsigned long (4 bytes)

Hoặc một char* lpIP;

Trang 4

Sử 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 << "IP: " << inet_ntoa(*(in_addr*) &YahooAddr) << "\n";

d Lấy IP theo tên máy

Visual-C++ Code: | Lựa chọn code | Ẩn/Hiện code |

struct hostent* FAR gethostbyname(const char* name);

Trong đó

Visual-C++ Code: | Lựa chọn code | Ẩn/Hiện code |

typedef struct hostent {

char FAR* h_name; // Tên máy tính

char FAR FAR** h_aliases; // Bí danh máy tính

short h_addrtype; // Kiểu IP (AF_INET)

short h_length; // Kích thước IP

char FAR FAR** h_addr_list; // Danh sách các địa chỉ IP

// 1 host có thể có 1 hoặc nhiều IP

} HOSTENT,

Ví dụ như:

Visual-C++ Code: | Lựa chọn code | Ẩn/Hiện code |

char lpHostName[100];

hostent *MyPC;

gethostname(lpHostName,100);

MyPC = gethostbyname(lpHostName);

e Lấy tên máy theo địa chỉ IP

Tương tự nhưng ngược lại

Visual-C++ Code: | Lựa chọn code | Ẩn/Hiện code |

hostent* FAR gethostbyaddr(const char* addr, int len, int type);

Ví dụ lấy thông tin Yahoo (có địa chỉ IP: 216.109.112.135)

Visual-C++ Code: | Lựa chọn code | Ẩn/Hiện code |

hostent *Yahoo;

u_long YahooAddr = inet_addr("216.109.112.135");

Yahoo = gethostbyaddr((char*)&YahooAddr,4,AF_INET);

Chương trình mẫu khởi tạo Socket:

Nguồn đọc thêm: http://www.xaluan.com/modules.php?

name=Forums&file=viewtopic&t=25035#ixzz0msvKVFug

Ngày đăng: 23/12/2013, 05:18

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w