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