DEMO MINI WEB BROWSER Lần này mình s ẽ DEMO 1 Web Browser.

Một phần của tài liệu [VC++] Lập Trình Mạng Với Thư Viện Winsock pps (Trang 29 - 33)

Chương trình như sau:

- Người dùng nhập vào địa chỉ Website

1. Các thao tác tại WEB BROWSER

a. Nhận địa chỉ Website và phân giải tên miền thành địa chỉ IP.

char lpDomain[100];

cout << "\n\nNhap ten mien can truy cap: http://"; cin.getline(lpDomain,100);

hostent *ConnectPC=NULL;

ConnectPC = gethostbyname(lpDomain); // Lay PC theo Tên Domain

if (!ConnectPC){

return 1; }

ConnectIP.sin_family = AF_INET;

ConnectIP.sin_port = htons( MY_PORT );

ConnectIP.sin_addr.s_addr = (*(DWORD*)ConnectPC->h_addr_list[0]); // Lay IP

cout << "\nMay chu:";

cout << ConnectPC->h_name << "\n";

cout << "IP: " << inet_ntoa(ConnectIP.sin_addr) << "\n"; b. Gửi REQUEST tới máy chủ WEB

Ví dụ người sử dụng nhập là "http://www.google.com" thì phải có Request tối

thiểu để máy chủ xử lý là:

GET / HTTP/1.1 Host: google.com User-Agent: eXecutive DEMO Client -> "Host: google.com" rất quan trọng vì có nhiều WEB thuê HOSTING và lúc này có nhiều WEBSITE cùng trên 1 WEBSERVER. Do đó phải xác định miền

truy cập

// NOI DUNG REQUEST

char *GetHTML = "GET / HTTP/1.1\r\n"; char HostRequest[100];

sprintf(HostRequest,"Host: %s\r\n",lpDomain);

char *UserAgent = "User-Agent: eXecutive DEMO Client \r\n\n";

// GUI REQUEST

send(Sock,GetHTML,strlen(GetHTML),0); send(Sock,HostRequest,strlen(HostRequest),0); send(Sock,UserAgent,strlen(UserAgent),0); c. Nhận RESPONSE từ máy chủ WEB

Nhận HEADER từ SERVER:

Nguyên tắc là chúng ta sẽ nhận từng BYTE . Khi thấy ký tự "\n\n" có nghĩa là kết thúc Header.

char HeaderResponse; while(!done){

nByteRevc = recv(Sock,&HeaderResponse,1,0); if(nByteRevc<0) // Loi done=TRUE; switch(HeaderResponse) { case '\r': break;

case '\n': // Neu gap "\n\n" hay "\n\r\n" thi ket thuc Header if (EndHeader == true){ done = TRUE; } EndHeader=true; break; default: EndHeader=false; break; } cout << HeaderResponse; } Nhận BODY từ SERVER:

Chúng ta sẽ nhận từng lúc 512 Bytes từ SERVER cho đến khi không được

SERVER hồi âm nữa (nByteRevc <= 0). Đoạn Code như sau:

char HTMLResponse[513]={0}; do{

nByteRevc = recv(Sock,HTMLResponse,sizeof(HTMLResponse)-1,0); // Đọc 512 Bytes

// Loai bo 1 ky tu bi thua tu HEADER if (HTMLResponse[0] == 0)

HTMLResponse[0] = ' ';

if(nByteRevc < 0) // Ket thuc HTML break;

HTMLResponse[nByteRevc] = 0;

// Ngắt chuỗi nếu RESPONSE nhận < 512 BYTES hoặc cuối cùng để in chuỗi.

cout << HTMLResponse;

}while (nByteRevc > 0);

Rõ ràng giữa send và recv không phải tuân theo quy tắc là gửi ba nhiêu bytes thì phải nhận bấy nhiêu bytes. Và chúng ta có thể gửi hay nhận nhiều lần, vấn đề này không quan trọng trong WINSOCK!

2. Download demo here

Một phần của tài liệu [VC++] Lập Trình Mạng Với Thư Viện Winsock pps (Trang 29 - 33)

Tải bản đầy đủ (PDF)

(38 trang)