Từ 1 tới 10 trên tổng số 10 kết quả

Đề tài: Bị lỗi phần sử lý sự kiện trong thư viện winsock2.h ! Xin cac bác giúp đỡ

  1. #1
    Ngày gia nhập
    08 2009
    Bài viết
    15

    Arrow Bị lỗi phần sử lý sự kiện trong thư viện winsock2.h ! Xin cac bác giúp đỡ

    Em có một đoạn mã có nhiệm vụ gửi request dưới dạng http request tới một sever và nhận kết quả trả về ( mã html ) , Chức năng nó có thể tạm gọi là một demo trình duyệt đơn giản .
    Tuy nhiên em viết thêm phần sử lý sự kiện cho các sự kiện mạng ( gửi nhận , kết nối ...) để thông báo mỗi khi có một sự kiện nào đó sảy ra . Và cũng để mở rộng hơn cho sau này .
    Code dưới của em khi không có phần sử lý sự kiện .....chạy bình thường
    C++ Code:
    1. // news.cpp : Defines the entry point for the console application.
    2. //
    3.  
    4. #include "stdafx.h"
    5. #ifndef UNICODE
    6. #define UNICODE
    7. #endif
    8.  
    9. #define WIN32_LEAN_AND_MEAN
    10. #include <iostream>
    11. #include <stdio.h>
    12. #include <winsock2.h>
    13. #include <fstream>
    14. #pragma comment (lib,"ws2_32.lib")
    15. using namespace std;
    16.  
    17. #define DEFAULT_BUFLEN 257
    18. #define DEFAULT_PORT 80
    19.  
    20. int main() {
    21.  
    22. // Khai báo kh?i t?o socket
    23.     int iResult;
    24.     WSADATA wsaData;
    25.     hostent *ConnectPC=NULL;
    26.     fstream file;
    27.     struct sockaddr_in clientService;
    28.  
    29.     size_t new_size;
    30.     SOCKET ConnectSocket;
    31.     char recvbuf[DEFAULT_BUFLEN] = {0};
    32.     WSAPROTOCOL_INFO *lpProtocolBuf = NULL;
    33.     DWORD dwErr,dwBufLen = 0;
    34.     // Khai báo thông s? cho s? lý s? ki?n
    35.     DWORD event_total=0;
    36.     DWORD index;
    37.     WSAEVENT EventArray[WSA_MAXIMUM_WAIT_EVENTS],new_event;
    38.     WSANETWORKEVENTS NetworkEvents;
    39.  
    40.     //----------------------
    41.  
    42.     iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
    43.     if (iResult != NO_ERROR) {
    44.         wprintf(L"WSAStartup failed with error: %d\n", iResult);
    45.        
    46.     }
    47.     // ===============bo dem ======================
    48.           int nRet = WSAEnumProtocols(NULL, lpProtocolBuf, &dwBufLen);
    49.           if(nRet != SOCKET_ERROR){
    50.          
    51.               cout<<"goi lan 1\n";
    52.           }
    53.           else if((dwErr = WSAGetLastError()) != WSAENOBUFS){
    54.  
    55.               cout<<"WSAEnumProtocols() failed with code %d\n"<<WSAGetLastError();
    56.           }
    57.           else{
    58.               cout<<"is ok\n";
    59.               lpProtocolBuf = (WSAPROTOCOL_INFO *)malloc(dwBufLen);
    60.               if (lpProtocolBuf)
    61.               {
    62.                   nRet = WSAEnumProtocols(NULL, lpProtocolBuf, &dwBufLen);
    63.                   if (nRet == SOCKET_ERROR)
    64.                   {
    65.                       printf("WSAEnumProtocols() failed with code %d\n", WSAGetLastError());
    66.                   }
    67.                   else
    68.                   {
    69.                       cout<<"rat ok\n";
    70.                   }
    71.               }
    72.           }
    73.  
    74.     ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    75.     if (ConnectSocket == INVALID_SOCKET) {
    76.         wprintf(L"socket failed with error: %ld\n", WSAGetLastError());
    77.         WSACleanup();
    78.         return 1;
    79.     }
    80.     char * domain ="nuocnga.net";
    81.        
    82.         ConnectPC = gethostbyname(domain);
    83.     clientService.sin_family = AF_INET;
    84.     clientService.sin_addr.s_addr = (*(DWORD*)ConnectPC->h_addr_list[0]);
    85.     clientService.sin_port = htons( DEFAULT_PORT );
    86.  
    87.     iResult = connect( ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService) );
    88.     if (iResult == SOCKET_ERROR) {
    89.         wprintf(L"connect failed with error: %d\n", WSAGetLastError() );
    90.         closesocket(ConnectSocket);
    91.         WSACleanup();
    92.         return 1;
    93.   }
    94.     ///////////////////////////////
    95.  
    96.     //char * header_re ="GET / HTTP/1.1\r\n\nHost: www.hvaonline.net\r\nConnection: Keep-Alive\r\nUser-Agent: Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.8 (like Gecko)\r\nAccept-Encoding: gzip,deflate,sdch\r\nAccept-Language: vi-VN,vi;q=0.8,fr-FR;q=0.6,fr;q=0.4,en-US;q=0.2,en;q=0.2\r\n\r\n";
    97.     //----------------------
    98.     char * get = "GET /default.aspx?tabid=325 HTTP/1.1\r\n";
    99.     char * hots = "Host: nuocnga.net\r\n";
    100.     char *use_agen = "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.17) Gecko/20110420 Firefox/3.6.17\r\n";
    101.     char *st = "Connection: Keep-Alive\r\n";
    102.     char * acc_encoding ="Accept-Encoding: gzip\r\n";
    103.     char * acc_languege = "Accept-Charset: ISO-8859-1,UTF-8;q=0.7,*;q=0.7\r\n";
    104.     char *cache = "Cache-Control: no-cache\r\n";
    105.     char  *relink = "Referer: http://google.com/\r\n\r\n";
    106.     // gui ...du lieu
    107.  
    108.     send( ConnectSocket, get, (int)strlen(get), 0 );
    109.     send( ConnectSocket, hots, (int)strlen(hots), 0 );
    110.     send( ConnectSocket, acc_encoding, (int)strlen(acc_encoding), 0 );
    111.     send( ConnectSocket, acc_languege, (int)strlen(acc_languege), 0 );
    112.     //send( ConnectSocket, cache, (int)strlen(cache), 0 );
    113.     send( ConnectSocket, st, (int)strlen(st), 0 );
    114.     send( ConnectSocket, use_agen, (int)strlen(use_agen), 0 );
    115.      size_t by_gui = send( ConnectSocket, relink, (int)strlen(relink), 0 );
    116.      cout<<by_gui;
    117.  
    118.     // Nhan du lieu
    119.                  
    120.          
    121.                  do{
    122.                                    
    123.                                         iResult = recv(ConnectSocket, recvbuf, sizeof(recvbuf)-1, 0);
    124.                                        
    125.                                         if(iResult<0){
    126.                                            
    127.                                         break;
    128.                                         }
    129.                                         recvbuf[iResult]=0;
    130.                                         cout<<recvbuf;
    131.                                              
    132.                  }while(iResult>0);
    133.  
    134.  
    135.     iResult = closesocket(ConnectSocket);
    136.     if (iResult == SOCKET_ERROR) {
    137.         wprintf(L"close failed with error: %d\n", WSAGetLastError());
    138.         WSACleanup();
    139.         return 1;
    140.     }
    141.     free(lpProtocolBuf);
    142.     WSACleanup();
    143.    
    144.     cin>>iResult;
    145.     return iResult;
    146.    
    147.    
    148. }
    Còn đoạn code dưới khi kết hợp sử lý sự kiện mạng với các hàm WSAWaitFormutipleEvents và một số các hàm liên quan khác . khi xuất hiện sự kiện gửi connect và gửi dữ liệu thì thông báo và gửi bình thường , Còn nhận dữ liệu hàm ( recv(); ) thì không sử lý .....và cũng không thông báo lỗi trả về .!
    C++ Code:
    1. int main() {
    2.  
    3. // Khai báo kh?i t?o socket
    4.     int iResult;
    5.     WSADATA wsaData;
    6.     hostent *ConnectPC=NULL;
    7.     fstream file;
    8.     struct sockaddr_in clientService;
    9.  
    10.     size_t new_size;
    11.     SOCKET ConnectSocket;
    12.     char recvbuf[DEFAULT_BUFLEN] = {0};
    13.     WSAPROTOCOL_INFO *lpProtocolBuf = NULL;
    14.     DWORD dwErr,dwBufLen = 0;
    15.     // Khai báo thông s? cho s? lý s? ki?n
    16.     DWORD event_total=0;
    17.     DWORD index;
    18.     WSAEVENT EventArray[WSA_MAXIMUM_WAIT_EVENTS],new_event;
    19.     WSANETWORKEVENTS NetworkEvents;
    20.  
    21.     //----------------------
    22.  
    23.     iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
    24.     if (iResult != NO_ERROR) {
    25.         wprintf(L"WSAStartup failed with error: %d\n", iResult);
    26.        
    27.     }
    28.     // ===============bo dem ======================
    29.           int nRet = WSAEnumProtocols(NULL, lpProtocolBuf, &dwBufLen);
    30.           if(nRet != SOCKET_ERROR){
    31.          
    32.               cout<<"goi lan 1\n";
    33.           }
    34.           else if((dwErr = WSAGetLastError()) != WSAENOBUFS){
    35.  
    36.               cout<<"WSAEnumProtocols() failed with code %d\n"<<WSAGetLastError();
    37.           }
    38.           else{
    39.               cout<<"is ok\n";
    40.               lpProtocolBuf = (WSAPROTOCOL_INFO *)malloc(dwBufLen);
    41.               if (lpProtocolBuf)
    42.               {
    43.                   nRet = WSAEnumProtocols(NULL, lpProtocolBuf, &dwBufLen);
    44.                   if (nRet == SOCKET_ERROR)
    45.                   {
    46.                       printf("WSAEnumProtocols() failed with code %d\n", WSAGetLastError());
    47.                   }
    48.                   else
    49.                   {
    50.                       cout<<"rat ok\n";
    51.                   }
    52.               }
    53.           }
    54.  
    55.     ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    56.     if (ConnectSocket == INVALID_SOCKET) {
    57.         wprintf(L"socket failed with error: %ld\n", WSAGetLastError());
    58.         WSACleanup();
    59.         return 1;
    60.     }
    61.     char * domain ="nuocnga.net";
    62.        
    63.         ConnectPC = gethostbyname(domain);
    64.     clientService.sin_family = AF_INET;
    65.     clientService.sin_addr.s_addr = (*(DWORD*)ConnectPC->h_addr_list[0]);
    66.     clientService.sin_port = htons( DEFAULT_PORT );
    67.  
    68.     iResult = connect( ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService) );
    69.     if (iResult == SOCKET_ERROR) {
    70.         wprintf(L"connect failed with error: %d\n", WSAGetLastError() );
    71.         closesocket(ConnectSocket);
    72.         WSACleanup();
    73.         return 1;
    74.   }
    75.     ///////////////////////////////
    76.  
    77.     //char * header_re ="GET / HTTP/1.1\r\n\nHost: www.hvaonline.net\r\nConnection: Keep-Alive\r\nUser-Agent: Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.8 (like Gecko)\r\nAccept-Encoding: gzip,deflate,sdch\r\nAccept-Language: vi-VN,vi;q=0.8,fr-FR;q=0.6,fr;q=0.4,en-US;q=0.2,en;q=0.2\r\n\r\n";
    78.     //----------------------
    79.     char * get = "GET /default.aspx?tabid=325 HTTP/1.1\r\n";
    80.     char * hots = "Host: nuocnga.net\r\n";
    81.     char *use_agen = "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.17) Gecko/20110420 Firefox/3.6.17\r\n";
    82.     char *st = "Connection: Keep-Alive\r\n";
    83.     char * acc_encoding ="Accept-Encoding: gzip\r\n";
    84.     char * acc_languege = "Accept-Charset: ISO-8859-1,UTF-8;q=0.7,*;q=0.7\r\n";
    85.     char *cache = "Cache-Control: no-cache\r\n";
    86.     char  *relink = "Referer: http://google.com/\r\n\r\n";
    87.     // gui ...du lieu
    88.  
    89.     //=======================================Ph?n s? lý các s? ki?n ==========================================
    90.    
    91.     EventArray[event_total] = WSACreateEvent();
    92.     //new_event = WSACreateEvent();
    93.     // ch?n s? ki?n m?ng
    94.     //  EventArray[event_total]=new_event;
    95.     WSAEventSelect(ConnectSocket,EventArray[event_total],FD_CONNECT | FD_WRITE | FD_READ);
    96.     event_total++;
    97.  
    98.  
    99.     index = WSAWaitForMultipleEvents(event_total, EventArray, FALSE, WSA_INFINITE, FALSE);
    100.     if(WSAEnumNetworkEvents(ConnectSocket,EventArray[index-WSA_WAIT_EVENT_0],&NetworkEvents)!= SOCKET_ERROR){
    101.  
    102.         cout<<"Enum ..is ok\n";
    103.         if(NetworkEvents.lNetworkEvents & FD_CONNECT)
    104.         {
    105.             if (NetworkEvents.iErrorCode[FD_CONNECT_BIT] == 0){
    106.                 cout<<"xuat hien mot yeu cau ket noi .... \n";
    107.                                                                             // Gui du lieu ......
    108.                                                                                 send( ConnectSocket, get, (int)strlen(get), 0 );
    109.                                                                                 send( ConnectSocket, hots, (int)strlen(hots), 0 );
    110.                                                                                 send( ConnectSocket, acc_encoding, (int)strlen(acc_encoding), 0 );
    111.                                                                                 send( ConnectSocket, acc_languege, (int)strlen(acc_languege), 0 );
    112.                                                                                 send( ConnectSocket, cache, (int)strlen(cache), 0 );
    113.                                                                                 send( ConnectSocket, st, (int)strlen(st), 0 );
    114.                                                                                 send( ConnectSocket, use_agen, (int)strlen(use_agen), 0 );
    115.                                                                                 send( ConnectSocket, relink, (int)strlen(relink), 0 );
    116.             }
    117.             else{
    118.                 cout<<"Loi su kien connect ! ma loi ..."<<WSAGetLastError()<<endl;
    119.             }
    120.         }
    121.         // ==========================Het phan su kien connect =======================
    122.          if(NetworkEvents.lNetworkEvents & FD_WRITE)
    123.         {
    124.             if(NetworkEvents.iErrorCode[FD_WRITE_BIT] == 0)
    125.             {
    126.                 cout<<" Dang gui Request toi sever .....\n";
    127.             }
    128.             else{
    129.                 cout<<"Loi su kien gui ......"<<WSAGetLastError()<<endl;
    130.             }
    131.         }
    132.         //esle{cout<<"Chua "<<endl;}
    133.         //===========================Het su kien gui ....============================
    134.          if(NetworkEvents.lNetworkEvents & FD_READ)
    135.         {
    136.             if(NetworkEvents.iErrorCode[FD_READ_BIT] == 0)
    137.             {
    138.                 cout<<" Dang doc du lieu gui ve .....\n";
    139.                                        // doc du lieu o day
    140.                 size_t by_nhan;
    141.                                         do{
    142.                                    
    143.                                          by_nhan = recv(ConnectSocket, recvbuf, sizeof(recvbuf)-1, 0);
    144.                                        
    145.                                         if(by_nhan<0){
    146.                                            
    147.                                         break;
    148.                                         }
    149.                                         recvbuf[by_nhan]=0;
    150.                                         cout<<recvbuf;                         // in ket qua ....                    
    151.                                         }
    152.                                         while(by_nhan>0);
    153.                                                              
    154.                                                              
    155.  
    156.             }
    157.             else
    158.             {
    159.                 cout<<"Loi su kien doc du lieu .....\n";
    160.             }
    161.         }
    162.         //==============================Het su kien doc du lieu ......================
    163.    
    164.     }
    165.     else
    166.     {
    167.         cout<<" khong co su kien nao or tiep theo .......\n "<<WSAGetLastError();
    168.     }
    169.  
    170.  
    171.  
    172.     //========================================================================================================
    173.  
    174.     iResult = closesocket(ConnectSocket);
    175.     if (iResult == SOCKET_ERROR) {
    176.         wprintf(L"close failed with error: %d\n", WSAGetLastError());
    177.         WSACleanup();
    178.         return 1;
    179.     }
    180.     free(lpProtocolBuf);
    181.     WSACleanup();
    182.    
    183.     cin>>iResult;
    184.     return iResult;
    185.    
    186.    
    187. }


    Xin các cao thủ giúp em với ...em gà quá .....
    Hi vọng sớm nhận được giúp đỡ của các bác em xin đựoc đa tạ ....đa tạ !
    Đã được chỉnh sửa lần cuối bởi zhukov : 19-06-2011 lúc 02:56 PM.

  2. #2
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Tại thời điểm bạn gọi hảm WSAEnumNetworkEvents, bạn vẫn chưa gửi dữ liệu. Sau khi gọi hàm đó xong, bạn mới kiểm tra điều kiện và gọi hàm send lên server. Vì bạn chưa send gì lên server nên server cũng chẳng có gì để trả cho bạn cả, và do đó FD_READ ko xảy ra. Nếu sau khi send xong, bạn recv ngay thì chắc chắn sẽ có html. Nhưng bạn lại kiểm tra điều kiện if(NetworkEvents.lNetworkEvents & FD_READ), và ko recv. Như vậy chương trình bị sai logic ngay từ đoạn WSAEnumNetworkEvents và dẫn tới sai luôn chỗ kiểm tra điều kiện phía dưới.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  3. #3
    Ngày gia nhập
    04 2010
    Nơi ở
    Binh Thanh, Hồ Chí Minh, Vietnam, Vietnam
    Bài viết
    504

    Híc, nhìn source giao thức HTTP của bạn mình oải quá :(
    Mình có làm một class HTTPS nhỏ, hy vọng giúp đc bạn. Giải thuật hơi cùi tý
    Header: https.h
    C++ Code:
    1. #ifndef __HTTPS_PROTOCOL_H_82DDD139689B8D73C15C6165472A8E14__INCLUDED_
    2.     #define __HTTPS_PROTOCOL_H_82DDD139689B8D73C15C6165472A8E14__INCLUDED_
    3.     #include <string.h>
    4.     #include <malloc.h>
    5.  
    6.     #include "winsock2.h"               // Thư viện Winsock 2
    7.     #pragma comment (lib,"ws2_32.lib")  // Thư viện Winsock 2
    8.     #include "openssl/ssl.h"            // Thư viện OpenSSL
    9.     #pragma comment (lib,"ssleay32.lib")// Thư viện OpenSSL
    10.     class HTTPS {
    11.         public:
    12.             HTTPS();
    13.             ~HTTPS();
    14.             char* Host() const;
    15.             bool Host(const char* pHost);
    16.        
    17.             char* Version() const;
    18.             bool Version(const char* pVersion);
    19.        
    20.             char* UserAgent() const;
    21.             bool UserAgent(const char* pUserAgent);
    22.  
    23.             char* Accept() const;
    24.             bool Accept(const char* pUserAgent);
    25.  
    26.             char* AcceptLanguage() const;
    27.             bool AcceptLanguage(const char* pUserAgent);
    28.  
    29.             char* AcceptCharset() const;
    30.             bool AcceptCharset(const char* pUserAgent);
    31.  
    32.             char* Header() const;
    33.             char* HeaderField(const char* pFieldName,int& iPos) const;
    34.  
    35.             char* Cookie(const char* pKey) const;
    36.             bool Cookie(const char* pKey,const char* pValue);
    37.  
    38.             char* Body(long& lLength) const;
    39.             bool Body(const char* pBody,long lLength);
    40.  
    41.             bool Request(const char* szMethod,const char* szRequest,bool bAttachBody = false,bool bAttachFromFile = false,bool bResponseToFile = false);
    42.        
    43.             int Open();
    44.             int Open(const char* pHost,int iPort,bool bUseSSL=false,bool bKeepAlive=false)
    45.             {
    46.                 Host(pHost);
    47.                 Port(iPort);
    48.                 this->bUseSSL = bUseSSL;
    49.                 this->bKeepAlive = bKeepAlive;
    50.                 return Open();
    51.             }
    52.             bool Close();
    53.             unsigned long TimeOut() const
    54.             {
    55.                 return lTimeOut;
    56.             }
    57.             void TimeOut(unsigned long lTimeOut)
    58.             {
    59.                 this->lTimeOut=lTimeOut;
    60.             }
    61.             unsigned short Post() const
    62.             {
    63.                 return iPort;
    64.             }
    65.             void Port(unsigned short iPort)
    66.             {
    67.                 this->iPort = iPort;
    68.             }
    69.             bool KeepAlive() const
    70.             {
    71.                 return bKeepAlive;
    72.             }
    73.             void KeepAlive(bool bKeepAlive)
    74.             {
    75.                 this->bKeepAlive=bKeepAlive;
    76.             }
    77.             bool UseSSL() const
    78.             {
    79.                 return bUseSSL;
    80.             }
    81.             void UseSSL(bool bUseSSL)
    82.             {
    83.                 this->bUseSSL=bUseSSL;
    84.             }
    85.             int StatusCode() const
    86.             {
    87.                 return iStatusCode;
    88.             }
    89.             void FileToAttach(FILE *file)
    90.             {
    91.                 fileAttach = file;
    92.             }
    93.             void FileToResponse(FILE *file)
    94.             {
    95.                 fileResponse = file;
    96.             }
    97.             void Clear();
    98.             void Reset();
    99.             void Default();
    100.             void Close(bool bClearAll=false);
    101.         private:
    102.             typedef struct _ChunkState
    103.             {
    104.                 long ChunkLength;
    105.                 bool Chunk;
    106.             }ChunkState,* PChunkState;
    107.            
    108.  
    109.             unsigned short  iPort;
    110.             unsigned long   lTimeOut;
    111.             bool            receivelData(bool bSaveToFile);             // Hàm nhận dữ liệu trả về.
    112.             bool            getstatusCode();            // Hàm lấy mã trạng thái của giao thức HTTP.
    113.             bool            processCookie();            // Hàm trích chuỗi Cookie từ Header
    114.             int             CreateRequest(char*& pPack,const char* pMethod,const char* pRequest) const; // Hàm tạo phần Request
    115.             void            RequestField(char*& pPack,const char* pKey,const char* pValue) const; // Hàm thêm các trường vào request
    116.             char*           RequestField(const char* pPos,const char* pKey) const;// Lấy các trường trong Request ra dựa vào tên và vị trí con trỏ hiện tại
    117.             void            DecodeChunked(PChunkState state,char *data,long &length,bool &bExit) const;
    118.             char            *szHost;
    119.             char            *szHeader;
    120.             char            *szBody;
    121.             char            *szUserAgent;
    122.             char            *szAccept;
    123.             char            *szAcceptCharset;
    124.             char            *szAcceptLanguage;
    125.             char            *szVersion;
    126.             char            *szCookie;                  // Lưu Cookie
    127.  
    128.             FILE            *fileAttach;
    129.             FILE            *fileResponse;
    130.             int             iStatusCode;
    131.             int             iSocket;
    132.     //      long            lHeaderLength;
    133.             long            lBodyLength;
    134.             bool            bUseSSL;
    135.             bool            bKeepAlive;
    136.             bool            bConnected;
    137.             SSL             *ssl;                       //Kết nối SSL, dùng thư viện OpenSSL.
    138.     };
    139. #endif
    Source: https.cpp
    C++ Code:
    1. #include "stdafx.h"
    2.  
    3. #include "https.h"
    4.  
    5. #define BUFFSIZE 4096 /* 4Kbytes */
    6. #define MIN(a,b) (a<b)?a:b
    7. #define HTTP_UserAgent "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1)"
    8. #define HTTP_Version "1.1"
    9. #define HTTP_Accept "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
    10. #define HTTP_AcceptLanguage "en-us"
    11. #define HTTP_AcceptCharset "UTF-8,*"
    12.  
    13.         HTTPS::HTTPS()
    14. {
    15.     szHost = NULL;
    16.     szCookie = NULL; // Lưu Cookie
    17.     szHeader = NULL;
    18.     szBody = NULL;
    19.     fileAttach = NULL;
    20.     fileResponse = NULL;
    21.     lTimeOut = 10000;
    22.     szAccept = _strdup(HTTP_Accept);
    23.     szAcceptCharset = _strdup(HTTP_AcceptCharset);
    24.     szAcceptLanguage = _strdup(HTTP_AcceptLanguage);
    25.     szUserAgent = _strdup(HTTP_UserAgent);
    26.     szVersion = _strdup(HTTP_Version);
    27.     lBodyLength = 0;
    28.     bKeepAlive = false;
    29.     bUseSSL = false;
    30.     WSADATA SData;
    31.     WSAStartup(0x0202,&SData);//Không thể khởi động Winsock, thoát.
    32. }
    33.         HTTPS::~HTTPS()
    34. {
    35.     delete [] szAccept;
    36.     szAccept = NULL;
    37.  
    38.     delete [] szAcceptCharset;
    39.     szAcceptCharset = NULL;
    40.  
    41.     delete [] szAcceptLanguage;
    42.     szAcceptLanguage = NULL;
    43.  
    44.     delete [] szUserAgent;
    45.     szUserAgent = NULL;
    46.  
    47.     delete [] szVersion;
    48.     szVersion = NULL;
    49.  
    50.     delete [] szHost;
    51.     szHost = NULL;
    52.  
    53.     delete [] szHeader;
    54.     szHeader = NULL;
    55.  
    56.     delete [] szBody;
    57.     szBody = NULL;
    58.  
    59.     delete [] szCookie;
    60.     szCookie = NULL;
    61.  
    62.     if (bUseSSL)
    63.     {
    64.         SSL_free(ssl);          // Nếu có kết nối SSL thì đóng.
    65.         ssl = NULL;
    66.     }
    67. }
    68. int     HTTPS::CreateRequest(char*& pPack,const char* pMethod,const char* pRequest) const
    69.  
    70. {
    71.     int iLen = strlen(pMethod) + strlen(pRequest)+ strlen(szVersion)+ strlen(pPack) + 12;
    72.  
    73.     char *pRet = NULL;
    74.     pRet = new char[iLen];
    75. #if defined(_MSC_VER) && (_MSC_VER >= 1400 )
    76.     sprintf_s(pRet, iLen * sizeof(char), "%s %s HTTP/%s\r\n%s\r\n\0", pMethod, pRequest, szVersion, pPack);
    77. #else
    78.     sprintf(pRet, "%s %s HTTP/%s\r\n%s\r\n\0", pMethod, pRequest, szVersion, pPack);
    79. #endif
    80.     delete [] pPack;
    81.     pPack = pRet;
    82.     return iLen - 1;
    83. }
    84. void    HTTPS::RequestField(char*& pPack,const char* pKey,const char* pValue) const
    85. {
    86.     char *pPos = NULL;
    87.     unsigned int iOldLen = 0;
    88.     if (pValue)
    89.     {
    90.         if (pPack)
    91.             iOldLen = strlen(pPack);
    92.         pPack = (char*)realloc(pPack,iOldLen + strlen(pKey) + strlen(pValue) + 3);
    93.         pPos = pPack + iOldLen;
    94.  
    95.         while(*pKey)
    96.             *(pPos++) = *(pKey++);
    97.  
    98.         while(*pValue)
    99.             *(pPos++) = *(pValue++);
    100.  
    101.         *(pPos++) = '\r';
    102.         *(pPos++) = '\n';
    103.         *(pPos  ) = '\0';
    104.     }
    105. }
    106. char*   HTTPS::RequestField(const char* pPos,const char* pKey) const
    107. {
    108.     char *pBegin = NULL;
    109.     char *pEnd = NULL;
    110.     char *pKeyCopy = NULL;
    111.     char *pRet = NULL;
    112.     int iLen = 0;
    113.  
    114.     if (pKey != NULL)
    115.     {
    116.         iLen = strlen(pKey);
    117.  
    118.         pKeyCopy = new char [iLen + 2];
    119.         memcpy(pKeyCopy, pKey, iLen * sizeof(char));
    120.         pKeyCopy[iLen    ] = ':';
    121.         pKeyCopy[iLen + 1] = '\0';
    122.         if ((pBegin = strstr((char*)pPos,pKeyCopy))!=NULL)
    123.         {
    124.             pBegin += strlen(pKeyCopy);
    125.  
    126.             while((*pBegin == ' ') && (*(pBegin + 1) != '\0'))
    127.                 pBegin++;
    128.             if ((pEnd = strchr(pBegin,'\r')) != NULL)
    129.             {
    130.                 iLen = pEnd - pBegin;
    131.                 if (iLen > 0)
    132.                 {
    133.                     pRet = new char[iLen + 1];
    134.                     memcpy(pRet, pBegin, iLen * sizeof(char));
    135.                     pRet[iLen] = '\0';
    136.                 }
    137.             }
    138.         }
    139.         delete [] pKeyCopy;
    140.         pKeyCopy = NULL;
    141.     }
    142.     return pRet;
    143. }
    144. int     HTTPS::Open()
    145. {
    146.     SSL_CTX *ctx = NULL;
    147.     int iRet=0;
    148.  
    149.     iSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // Khởi tạo Socket
    150.     if(iSocket != INVALID_SOCKET)
    151.     {
    152.         HOSTENT *hostInfo = gethostbyname(szHost); // Nhờ DNS phân giải địa chỉ.
    153.         if(hostInfo != NULL)
    154.         {
    155.             SOCKADDR_IN SockAddr;
    156.             SockAddr.sin_port = htons(iPort);
    157.             SockAddr.sin_family = AF_INET;
    158.             SockAddr.sin_addr.s_addr = (*(DWORD*)hostInfo->h_addr_list[0]);
    159.             iRet = connect(iSocket,(SOCKADDR*)(&SockAddr), sizeof(SockAddr)); // Kết nối tới host.
    160.             if (iRet == SOCKET_ERROR)
    161.             {
    162.                 //Lỗi...
    163.                 wprintf(L"=CRITICAL= | connect() failed with error code %d, WSAGetLastError = %d\n", iRet, WSAGetLastError());
    164.             }
    165.             if (iRet == 0)
    166.             {
    167.                 if (bUseSSL)
    168.                 {
    169.                     SSL_library_init();
    170.                     ctx = SSL_CTX_new(SSLv23_client_method());
    171.                     ssl = SSL_new(ctx);
    172.                     SSL_CTX_free(ctx);
    173.                     SSL_set_fd(ssl,iSocket);
    174.                     iRet = SSL_get_error(ssl,SSL_connect(ssl));
    175.                     if (iRet == SSL_ERROR_SSL)
    176.                         return 0;
    177.                 }
    178.                 bConnected = true;
    179.                 return iSocket;
    180.             }
    181.         }
    182.     }
    183.     else
    184.     {
    185.         //Lỗi...
    186.         wprintf(L"=CRITICAL= | socket() failed with error code %d, WSAGetLastError = %d\n", iRet, WSAGetLastError());
    187.     }
    188.     return 0;
    189. }
    190. char*   HTTPS::Host() const
    191. {  
    192.     unsigned int iLen = 0;
    193.     char *pRet = NULL;
    194.     if (szHost!=NULL)
    195.     {
    196.         iLen = strlen(szHost);
    197.         pRet = new char[iLen + 1];
    198.         memcpy(pRet, szHost, iLen * sizeof(char));
    199.         pRet[iLen] = '\0';
    200.     }
    201.     return pRet;
    202. }
    203. bool    HTTPS::Host(const char* pHost)
    204. {
    205.     unsigned int iLen = 0;
    206.     if (pHost != NULL)
    207.     {
    208.         delete [] szHost;
    209.         szHost = NULL;
    210.    
    211.         iLen = strlen(pHost);
    212.         szHost = new char[iLen + 1];
    213.         memcpy(szHost, pHost, iLen * sizeof(char));
    214.         szHost[iLen] = '\0';
    215.         return true;
    216.     }
    217.     return false;
    218. }
    219. char*   HTTPS::Header() const
    220. {
    221.     unsigned int iLen = 0;
    222.     char *pRet = NULL;
    223.     if (szHeader != NULL)
    224.     {
    225.         iLen = strlen(szHeader);
    226.         pRet = new char[iLen + 1];
    227.         memcpy(pRet, szHeader, iLen * sizeof(char));
    228.         pRet[iLen] = '\0';
    229.     }
    230.     return pRet;
    231. }
    232. char*   HTTPS::HeaderField(const char* pFieldName,int& iPos) const
    233. {
    234.     char *pPos = NULL;
    235.     char *pValue = NULL;
    236.     if (pFieldName != NULL)
    237.     {
    238.         pPos = szHeader + iPos;
    239.         pValue = RequestField(pPos, pFieldName);
    240.         if (pValue != NULL)
    241.         {
    242.             pPos = strstr(pPos, pFieldName) + strlen(pFieldName) + strlen(pValue) + 1;
    243.             iPos = pPos - szHeader;
    244.             return pValue;
    245.         }
    246.     }
    247.     return NULL;
    248.  
    249. }
    250. bool    HTTPS::Body(const char* pBody,long lLength)
    251. {
    252.     if (pBody != NULL)
    253.     {
    254.         delete [] szBody;
    255.         szBody = new char[lLength + 1];
    256.         memcpy(szBody, pBody, lLength * sizeof(char));
    257.         szBody[lLength] = '\0';
    258.         return true;
    259.     }
    260.     return false;
    261. }
    262. char*   HTTPS::Body(long& lLength) const
    263. {
    264.     char *pRet = NULL;
    265.     lLength = 0;
    266.     if (szBody != NULL)
    267.     {
    268.         pRet = new char[lBodyLength + 1];
    269.         memcpy(pRet, szBody, lBodyLength * sizeof(char));
    270.         pRet[lBodyLength] = '\0';
    271.         lLength = lBodyLength;
    272.         return pRet;
    273.     }
    274.     return NULL;
    275. }
    276. bool    HTTPS::Version(const char* pVersion)
    277. {
    278.     if (pVersion != NULL)
    279.     {
    280.         delete [] szVersion;
    281.         int iLen = strlen(pVersion);
    282.         szVersion = new char[iLen + 1];
    283.         memcpy(szVersion, pVersion, iLen * sizeof(char));
    284.         szVersion[iLen] = '\0';
    285.         return true;
    286.     }
    287.     return false;
    288. }
    289. char*   HTTPS::Version() const
    290. {
    291.     char *pRet = NULL;
    292.     if (szVersion != NULL)
    293.     {
    294.         int iLen = strlen(szVersion);
    295.         pRet = new char[iLen + 1];
    296.         memcpy(pRet, szVersion, iLen * sizeof(char));
    297.         pRet[iLen] = '\0';
    298.         return pRet;
    299.     }
    300.     return NULL;
    301. }
    302. bool    HTTPS::UserAgent(const char *pUserAgent)
    303. {
    304.     if (pUserAgent)
    305.     {
    306.         delete [] szUserAgent;
    307.         int iLen = strlen(pUserAgent);
    308.         szUserAgent = new char[iLen + 1];
    309.         memcpy(szUserAgent, pUserAgent, iLen * sizeof(char));
    310.         szUserAgent[iLen] = '\0';
    311.         return true;
    312.     }
    313.     return false;
    314. }
    315. char*   HTTPS::UserAgent() const
    316. {
    317.     char *pRet = NULL;
    318.     if (szUserAgent != NULL)
    319.     {
    320.         int iLen = strlen(szUserAgent);
    321.         pRet = new char[iLen + 1];
    322.         memcpy(pRet,szUserAgent, iLen * sizeof(char));
    323.         pRet[iLen] = '\0';
    324.         return pRet;
    325.     }
    326.     return NULL;
    327. }
    328. bool    HTTPS::Accept(const char* pAccept)
    329. {
    330.     if (pAccept != NULL)
    331.     {
    332.         delete [] szAccept;
    333.         int iLen = strlen(pAccept);
    334.         szAccept = new char[iLen + 1];
    335.         memcpy(szAccept, pAccept, iLen * sizeof(char));
    336.         szAccept[iLen] = '\0';
    337.         return true;
    338.     }
    339.     return false;
    340. }
    341. char*   HTTPS::Accept() const
    342. {
    343.     if (szAccept != NULL)
    344.     {
    345.         char *pRet = NULL;
    346.         int iLen = strlen(szAccept);
    347.         pRet = new char[iLen + 1];
    348.         memcpy(pRet,szAccept, iLen * sizeof(char));
    349.         pRet[iLen] = '\0';
    350.         return pRet;
    351.     }
    352.     return NULL;
    353. }
    354. bool    HTTPS::AcceptLanguage(const char* pAcceptLanguage)
    355. {
    356.     if (pAcceptLanguage)
    357.     {
    358.         delete [] szAcceptLanguage;
    359.         int iLen = strlen(pAcceptLanguage);
    360.         szAcceptLanguage = new char[iLen + 1];
    361.         memcpy(szAcceptLanguage, pAcceptLanguage, iLen * sizeof(char));
    362.         szAcceptLanguage[iLen] = '\0';
    363.         return true;
    364.     }
    365.     return false;
    366. }
    367. char*   HTTPS::AcceptLanguage() const
    368. {
    369.     if (szAcceptLanguage!=NULL)
    370.     {
    371.         char *pRet = NULL;
    372.         int iLen = strlen(szAcceptLanguage);
    373.         pRet = new char[iLen + 1];
    374.         memcpy(pRet,szAcceptLanguage, iLen * sizeof(char));
    375.         pRet[iLen] = '\0';
    376.         return pRet;
    377.     }
    378.     return NULL;
    379. }
    380. bool    HTTPS::AcceptCharset(const char* pAcceptCharset)
    381. {
    382.     if (pAcceptCharset)
    383.     {
    384.         delete [] szAcceptCharset;
    385.         int iLen = strlen(pAcceptCharset);
    386.         szAcceptCharset = new char[iLen + 1];
    387.         memcpy(szAcceptCharset, pAcceptCharset, iLen * sizeof(char));
    388.         szAcceptCharset[iLen] = '\0';
    389.         return true;
    390.     }
    391.     return false;
    392. }
    393. char*   HTTPS::AcceptCharset() const
    394. {
    395.  
    396.     if (szAcceptCharset!=NULL)
    397.     {
    398.         char *pRet = NULL;
    399.         int iLen = strlen(szAcceptCharset);
    400.         pRet = new char[iLen + 1];
    401.         memcpy(pRet,szAcceptCharset, iLen * sizeof(char));
    402.         pRet[iLen] = '\0';
    403.         return pRet;
    404.     }
    405.     return NULL;
    406. }
    407. bool    HTTPS::Cookie(const char* pKey,const char* pValue)
    408. {
    409.     if ((pKey != NULL) && (pValue != NULL))
    410.     {
    411.         unsigned int iLen = 0;
    412.         char *pPos = NULL;
    413.         char *pTMP = NULL;
    414.  
    415.         iLen = strlen(pKey) + strlen(pValue) + 3; // Thêm một ký tự '=', một ký tự ';' và một ký tự ' '
    416.         if (szCookie == NULL)
    417.         {
    418.             pTMP = new char[iLen + 1]; 
    419.             pPos = pTMP;
    420.         }
    421.         else
    422.         {
    423.             iLen += strlen(szCookie);
    424.             pTMP = new char[iLen + 1];
    425.             pPos = pTMP;
    426.             memcpy(pPos, szCookie, strlen(szCookie) * sizeof(char));   
    427.             pPos += strlen(szCookie);
    428.             delete [] szCookie;// Giải phóng bộ nhớ đã cấp phát.
    429.         }
    430.         memcpy(pPos, pKey, strlen(pKey) * sizeof(char));        pPos+=strlen(pKey);
    431.         *(pPos++) = '=';
    432.         memcpy(pPos, pValue, strlen(pValue) * sizeof(char));    pPos+=strlen(pValue);
    433.         memcpy(pPos, "; ", 2 * sizeof(char));
    434.         pTMP[iLen] = '\0';
    435.         szCookie = pTMP;
    436.         return true;
    437.     }
    438.     return false;
    439. }
    440. char*   HTTPS::Cookie(const char* pKey) const
    441. {
    442.     if ((pKey != NULL) && (szCookie != NULL))
    443.     {
    444.         char *pKeyCopy = NULL;
    445.         char *pRet = NULL;
    446.         char *beginPos = NULL;
    447.         char *endPos = NULL;
    448.         unsigned int iLen = 0;
    449.  
    450.         iLen = strlen(pKey);// Lấy chiều dài khóa.
    451.         pKeyCopy = new char[iLen + 2];
    452.         memcpy(pKeyCopy, pKey, iLen * sizeof(char));
    453.         pKeyCopy[iLen    ] = '=';
    454.         pKeyCopy[iLen + 1] = '\0';
    455.         if (beginPos = strstr(szCookie, pKeyCopy)) // Kiểm tra xem có khóa Cookie cần tìm không.
    456.         {
    457.             beginPos += strlen(pKeyCopy);// Di chuyển đến vị trí bắt đầu của giá trị.
    458.             endPos = strchr(beginPos, ';');// Vị trí kết thúc Cookie.
    459.             iLen = endPos - beginPos;// Lấy chiều dài của giá trị.
    460.             if (iLen > 0)
    461.             {
    462.                 pRet = new char[iLen + 1];
    463.                 memcpy(pRet, beginPos, iLen * sizeof(char));
    464.                 pRet[iLen] = '\0';
    465.                 return pRet;
    466.             }
    467.         }
    468.         delete [] pKeyCopy;
    469.     }
    470.     return NULL;
    471. }
    472. bool    HTTPS::Request(const char* szMethod,const char* szRequest,bool bAttachBody,bool bAttachFromFile,bool bResponseToFile)
    473. {
    474.     if ((bConnected) && (szMethod != NULL))
    475.     {
    476.         int iLen = 0;
    477.         int iRet = 0;
    478.         long lFileLength = 0;
    479.         char *pTMP = NULL;
    480.  
    481.         RequestField(pTMP, "Host: ", szHost);
    482.         RequestField(pTMP, "User-Agent: ", szUserAgent);
    483.         RequestField(pTMP, "Accept: ", szAccept);
    484.         RequestField(pTMP, "Accept-Charset: ",szAcceptCharset);
    485.         RequestField(pTMP, "Accept-Language: ", szAcceptLanguage);
    486.         RequestField(pTMP, "Connection: ", bKeepAlive?"Keep-Alive":"Close");
    487.         RequestField(pTMP, "Cookie: ", szCookie);
    488.         if (bAttachBody)
    489.         {
    490.             char *pTMP3 = NULL;
    491.             long lLength = 0;
    492.             pTMP3 = new char[12];// Kiểu long có tối đa 10 ký số, thêm một dấu "-" và một ký tự kết thúc.
    493.             memset(pTMP3, 0, 12 * sizeof(char));
    494.             if (bAttachFromFile)
    495.             {
    496.                 if (fileAttach != NULL)
    497.                 {
    498.                     fseek(fileAttach, 0, SEEK_END);
    499.                     lFileLength = ftell(fileAttach);
    500.                     fseek(fileAttach, 0, SEEK_SET);
    501.                     lLength = lFileLength;
    502.                 }
    503.             }
    504.             else
    505.             {
    506.                 if (szBody != NULL)
    507.                     lLength = lBodyLength;
    508.             }
    509. #if defined(_MSC_VER) && (_MSC_VER >= 1400 )
    510.             _itoa_s(lLength, pTMP3, 11 * sizeof(char), 10);
    511. #else
    512.             _itoa(lLength, pTMP3, 10);
    513. #endif
    514.             RequestField(pTMP, "Content-Length: ", pTMP3);
    515.             RequestField(pTMP, "Content-Type: ", "application/x-www-form-urlencoded");
    516.             delete [] pTMP3;
    517.         }
    518.         iLen = CreateRequest(pTMP, szMethod, szRequest);
    519.         if (bUseSSL)
    520.             iRet = SSL_write(ssl, pTMP, iLen);
    521.         else
    522.             iRet = send(iSocket, pTMP, iLen, 0);
    523.  
    524.         delete [] pTMP;
    525.         pTMP = NULL;
    526.  
    527.         if (iLen == iRet)
    528.         {
    529.             if (bAttachBody)
    530.             {
    531.                 char *pPos = NULL;
    532.                 int iLen = 0;
    533.                 long lSize = 0;
    534.                 if (bAttachFromFile)
    535.                 {
    536.                     lSize = lFileLength;
    537.                     pPos = new char[BUFFSIZE];
    538.                     fread(pPos, MIN(BUFFSIZE, lSize) * sizeof(char), 1, fileAttach);
    539.                 }
    540.                 else
    541.                 {
    542.                     lSize = lBodyLength;
    543.                     pPos = szBody;
    544.                 }
    545.                 while (lSize > 0)
    546.                 {
    547.                     iLen = MIN(BUFFSIZE, lSize);
    548.                     if (bUseSSL)
    549.                         iRet = SSL_write(ssl, pPos, iLen);
    550.                     else
    551.                         iRet = send(iSocket, pPos, iLen, 0);
    552.                     if (iLen != iRet)
    553.                         return false;
    554.    
    555.                     lSize -= iLen;
    556.                     if (bAttachFromFile)
    557.                         fread(pPos, MIN(BUFFSIZE, lSize) * sizeof(char), 1, fileAttach);
    558.                     else
    559.                         pPos += iLen;
    560.                 }
    561.                 if (bAttachFromFile)
    562.                     delete [] pPos;
    563.             }
    564.             if (receivelData(bResponseToFile) && getstatusCode() && processCookie())
    565.                 return true;
    566.         }
    567.     }
    568.     return false;
    569. }
    570. bool    HTTPS::processCookie()
    571. {
    572.     if (szHeader != NULL)// Không thể lấy Cookie khi phần Header trống.
    573.     {
    574.         char *pPos = NULL;
    575.         char *pPos1 = NULL;
    576.         char *pPos2 = NULL;
    577.         char *pTMP = NULL;
    578.         char *pBegin = NULL;
    579.         char *pEnd = NULL;
    580.         char *pValue = NULL;
    581.  
    582.         unsigned int iLen = 0;
    583.         unsigned int iOldLen = 0;
    584.  
    585.         delete [] szCookie;
    586.         pPos = szHeader;
    587.         while((pValue = RequestField(pPos, "Set-Cookie")) != NULL)
    588.         {
    589.             iLen = strcspn(pValue, ";");
    590.             if (pTMP != NULL)
    591.                 iOldLen = strlen(pTMP);
    592.             pTMP = (char*)realloc(pTMP,iOldLen + iLen + 3);
    593.            
    594.             memcpy(pTMP + iOldLen, pValue, iLen * sizeof(char));
    595.             pTMP[iLen + iOldLen    ] = ';';
    596.             pTMP[iLen + iOldLen + 1] = ' ';
    597.             pTMP[iLen + iOldLen + 2] = '\0';
    598.  
    599.             pPos = strstr(pPos, "Set-Cookie") + strlen(pValue) + 12;
    600.  
    601.             delete [] pValue;
    602.             pValue = NULL;
    603.         }
    604.         if (pTMP != NULL)
    605.         {
    606.             iLen = strlen(pTMP);
    607.  
    608.             szCookie = new char[iLen + 1];
    609.             memcpy(szCookie, pTMP, iLen * sizeof(char));
    610.             szCookie[iLen] = '\0';
    611.  
    612.             delete [] pTMP;
    613.             pTMP = NULL;
    614.         }
    615.         return true;
    616.     }
    617.     return false;
    618. }
    619. bool    HTTPS::receivelData(bool bFile)
    620. {
    621.     int iRet = 0;
    622.     fd_set fdread;
    623.     timeval timeout;
    624.     /* Thời gian chờ server trả lời. */
    625.     timeout.tv_sec = lTimeOut / 1000;
    626.     timeout.tv_usec = lTimeOut % 1000;
    627.  
    628.     /* Xóa rỗng tập trước khi gọi select() */
    629.     FD_ZERO(&fdread);
    630.  
    631.     /* Đặt Socket vào tập hợp. */
    632.     FD_SET(iSocket, &fdread);
    633.     if ((iRet = select(0, &fdread, NULL, NULL, &timeout)) == SOCKET_ERROR)
    634.     {
    635.         //Lỗi...
    636.         wprintf(L"=CRITICAL= | select() failed with error code %d, WSAGetLastError = %d\n", iRet, WSAGetLastError());
    637.     }
    638.     if (iRet > 0)
    639.     {
    640.         if (FD_ISSET(iSocket,&fdread))
    641.         {
    642.             char *pTMP = NULL;
    643.            
    644.             /* Nhận phần Header */
    645.  
    646.             bool bDone = false;
    647.             bool bEndHeader = false;
    648.             char HeaderResponse;
    649.             unsigned int iLen = 0;
    650.             long bytesRead = 0;
    651.             while(!bDone)
    652.             {
    653.                 if (bUseSSL)
    654.                     bytesRead = SSL_read(ssl, &HeaderResponse, 1);
    655.                 else
    656.                     bytesRead = recv(iSocket, &HeaderResponse, 1, 0);
    657.                
    658.                 if(bytesRead <= 0)
    659.                     bDone = true;
    660.                 switch(HeaderResponse)
    661.                 {
    662.                     case '\r':
    663.                         break;
    664.                     case '\n': // Nếu gặp "\n\n" hay "\n\r\n" thì kết thúc Header
    665.                         if (bEndHeader)
    666.                             bDone = true;
    667.                         bEndHeader = true;
    668.                         break;
    669.                     default:
    670.                         bEndHeader = false;
    671.                         break;
    672.                 }
    673.                 pTMP = (char*)realloc(pTMP, iLen + 2);
    674.                 *(pTMP + iLen++ ) = HeaderResponse;
    675.                 *(pTMP + iLen   ) = '\0';
    676.             }
    677.             delete [] szHeader;
    678.             szHeader = new char[iLen + 1];
    679.             memcpy(szHeader, pTMP, iLen * sizeof(char));
    680.             szHeader[iLen] = '\0';
    681.             delete [] pTMP;
    682.             pTMP = NULL;
    683.  
    684.             /* Nhận phần Body. */
    685.  
    686.             char *pBodyResponse = new char[BUFFSIZE];;
    687.             bool bChunked = false;
    688.             bool bExit = false;
    689.             long BuffSize = 0;
    690.  
    691.             ChunkState stt;
    692.             stt.Chunk = false;
    693.             stt.ChunkLength = 0;
    694.  
    695.            
    696.             /* Nếu con trỏ tập tin bằng NULL thì không ghi vào tập tin. */
    697.             if (fileResponse == NULL)
    698.                 bFile = false;
    699.             /* Đưa con trỏ về đâu tập tin */
    700.             if (bFile)
    701.                 fseek(fileResponse, 0, SEEK_SET);
    702.            
    703.             pTMP = RequestField(szHeader,"Transfer-Encoding");
    704.             if (pTMP != NULL)
    705.             {
    706.                 bChunked = (strcmp(pTMP,"chunked") == 0);
    707.                 delete[] pTMP;
    708.                 pTMP = NULL;
    709.             }
    710.  
    711.             do
    712.             {
    713.                 /* Xóa rỗng tập trước khi gọi select() */
    714.                 FD_ZERO(&fdread);
    715.  
    716.                 /* Đặt Socket vào tập hợp. */
    717.                 FD_SET(iSocket, &fdread);
    718.                 if ((iRet = select(0, &fdread, NULL, NULL, &timeout)) == SOCKET_ERROR)
    719.                 {
    720.                     //Lỗi...
    721.                     wprintf(L"=CRITICAL= | select() failed with error code %d, WSAGetLastError = %d\n", iRet, WSAGetLastError());
    722.                     break;
    723.                 }
    724.                 if (iRet > 0)
    725.                     if (FD_ISSET(iSocket, &fdread))
    726.                     {
    727.                         /* Xóa sạch dữ liệu trước khi nhận dữ liệu mới. */
    728.                         memset(pBodyResponse, 0, BUFFSIZE);
    729.                         if (bUseSSL)
    730.                             /* Đọc BUFFSIZE Bytes. */
    731.                             bytesRead = SSL_read(ssl, pBodyResponse, BUFFSIZE);
    732.                         else
    733.                             /* Đọc BUFFSIZE Bytes. */
    734.                             bytesRead = recv(iSocket, pBodyResponse, BUFFSIZE, 0);
    735.                         /* Không đọc được dữ liệu hoặc kết nối bị lỗi thì thoát. */
    736.                         if (bytesRead <= 0)
    737.                             break;
    738.  
    739.                         /* Giải mã Chunk lúc run-time. */
    740.                         if (bChunked)
    741.                             DecodeChunked(&stt, pBodyResponse, bytesRead, bExit);
    742.  
    743.                         if (bFile)
    744.                             /* Ghi dữ liệu vào tập tin. */
    745.                             fwrite(pBodyResponse, bytesRead * sizeof(char), 1, fileResponse);
    746.                         else
    747.                         {
    748.                             /* Chép dữ liệu vừa nhận được vào vùng nhớ tạm. */
    749.                             pTMP = (char*)realloc(pTMP, BuffSize + bytesRead + 1);
    750.                             memcpy(pTMP + BuffSize, pBodyResponse, bytesRead * sizeof(char));
    751.                             pTMP[BuffSize + bytesRead] = '\0';
    752.                             BuffSize += bytesRead;
    753.                         }
    754.                     }
    755.                     else
    756.                         break;
    757.             }
    758.             while ((iRet > 0) && !bExit);
    759.  
    760.             delete [] pBodyResponse;
    761.             delete [] szBody;
    762.  
    763.             szBody = NULL;
    764.             lBodyLength = 0;
    765.             /* Nếu ghi vào tập tin hoặc không nhận được phần Body
    766.                thì vùng nhớ tạm sẽ không được cấp phát.
    767.             */
    768.             if (pTMP != NULL)
    769.             {
    770.                 szBody = new char[BuffSize + 1];
    771.                 memcpy(szBody, pTMP, BuffSize * sizeof(char));
    772.                 szBody[BuffSize] = '\0';
    773.                 lBodyLength = BuffSize;
    774.                 delete [] pTMP;
    775.             }
    776.             return true;
    777.         }
    778.     }
    779.     return false;
    780. }
    781. bool    HTTPS::getstatusCode()
    782. {
    783.     iStatusCode = 0;
    784.     if (szHeader != NULL)
    785.     {
    786.         char *pPos = NULL;
    787.         pPos = szHeader;
    788.         while((*(pPos++) != ' ') && (*pPos != '\0'));
    789.         iStatusCode = atoi(pPos);
    790.         return true;
    791.     }
    792.     return false;
    793. }
    794. void    HTTPS::Clear()
    795. {
    796.     iStatusCode = 0;
    797.     lBodyLength = 0;
    798.  
    799.     delete [] szHeader;
    800.     szHeader = NULL;
    801.  
    802.     delete [] szBody;
    803.     szBody = NULL;
    804. }
    805. void    HTTPS::Default()
    806. {
    807.     delete [] szAccept;
    808.     szAccept = NULL;
    809.  
    810.     delete [] szAcceptCharset;
    811.     szAcceptCharset = NULL;
    812.  
    813.     delete [] szAcceptLanguage;
    814.     szAcceptLanguage = NULL;
    815.  
    816.     delete [] szUserAgent;
    817.     szUserAgent = NULL;
    818.  
    819.     delete [] szVersion;
    820.     szVersion = NULL;
    821.  
    822.     lTimeOut = 10000;
    823.     szAccept = _strdup(HTTP_Accept);
    824.     szAcceptCharset = _strdup(HTTP_AcceptCharset);
    825.     szAcceptLanguage = _strdup(HTTP_AcceptLanguage);
    826.     szUserAgent = _strdup(HTTP_UserAgent);
    827.     szVersion = _strdup(HTTP_Version);
    828. }
    829. void    HTTPS::Reset()
    830. {
    831.     delete [] szHost;
    832.     szHost = NULL;
    833.  
    834.     delete [] szHeader;
    835.     szHeader = NULL;
    836.  
    837.     delete [] szBody;
    838.     szBody = NULL;
    839.  
    840.     delete [] szCookie;
    841.     szCookie = NULL;
    842.  
    843.     iStatusCode = 0;
    844.     lBodyLength = 0;
    845.  
    846.     bKeepAlive = false;
    847.     bUseSSL = false;
    848.     bConnected = false;
    849.  
    850.     if (bUseSSL)
    851.     {
    852.         SSL_free(ssl); // Nếu có kết nối SSL thì đóng.
    853.         ssl = NULL;
    854.     }
    855.     if(iSocket != 0)
    856.     {
    857.         shutdown(iSocket,SD_BOTH);  // Đóng kết nối
    858.         closesocket(iSocket);       // Hủy Socket
    859.     }
    860. }
    861. void    HTTPS::Close(bool bClearAll)
    862. {
    863.     if (bClearAll)
    864.     {
    865.         delete [] szAccept;
    866.         szAccept = NULL;
    867.  
    868.         delete [] szAcceptCharset;
    869.         szAcceptCharset = NULL;
    870.  
    871.         delete [] szAcceptLanguage;
    872.         szAcceptLanguage = NULL;
    873.  
    874.         delete [] szUserAgent;
    875.         szUserAgent = NULL;
    876.  
    877.         delete [] szVersion;
    878.         szVersion = NULL;
    879.  
    880.  
    881.         lTimeOut = 10000;
    882.         szAccept = _strdup(HTTP_Accept);
    883.         szAcceptCharset = _strdup(HTTP_AcceptCharset);
    884.         szAcceptLanguage = _strdup(HTTP_AcceptLanguage);
    885.         szUserAgent = _strdup(HTTP_UserAgent);
    886.         szVersion = _strdup(HTTP_Version);
    887.  
    888.         iStatusCode = 0;
    889.         lBodyLength = 0;
    890.  
    891.         delete [] szHost;
    892.         szHost = NULL;
    893.  
    894.         delete [] szHeader;
    895.         szHeader = NULL;
    896.  
    897.         delete [] szBody;
    898.         szBody = NULL;
    899.  
    900.         delete [] szCookie;
    901.         szCookie = NULL;
    902.  
    903.         bKeepAlive = false;
    904.         bUseSSL = false;
    905.     }
    906.     if (bUseSSL)
    907.     {
    908.         SSL_free(ssl);          // Nếu có kết nối SSL thì đóng.
    909.         ssl = NULL;
    910.     }
    911.     if(iSocket != 0)
    912.     {
    913.         shutdown(iSocket, SD_BOTH); // Đóng kết nối
    914.         closesocket(iSocket);       // Hủy Socket
    915.     }
    916.     bConnected = false;
    917. }
    918. void HTTPS::DecodeChunked(PChunkState state, char *data, long &length, bool &bExit) const
    919. {
    920.     long inLength = 0;
    921.     long outLength = 0;
    922.  
    923.     char *out = NULL;
    924.     char *posOut = NULL;
    925.     char *posIn = NULL;
    926.     posIn = data;
    927.     inLength = length;
    928.     out = new char[inLength];
    929.     posOut = out;
    930.     do
    931.     {
    932.         if (state->Chunk == false)
    933.         {
    934.             char *CRLF = NULL;
    935.             char *pLength = NULL;
    936.             char *error = NULL;
    937.             CRLF = strstr(posIn,"\r\n");
    938.             if (CRLF != NULL)
    939.             {
    940.                 int iLen = CRLF - posIn;
    941.                 pLength = new char[iLen + 1];
    942.                 memcpy(pLength, posIn,iLen * sizeof(char));
    943.                 pLength[iLen] = '\0';
    944.  
    945.                 state->ChunkLength = strtol(pLength, &error, 16);
    946.                 state->Chunk = (state->ChunkLength != 0); /* Phần tiếp theo là dữ liệu. */
    947.                 posIn = CRLF + 2; /* Di chuyển qua kích thước của Chunk. */
    948.                 inLength -= (iLen + 2);
    949.                 bExit = (state->ChunkLength == 0);
    950.             }
    951.             else
    952.                 break;
    953.         }
    954.         else
    955.         {
    956.             if (state->ChunkLength == 0)
    957.                 break;
    958.             /* Kích thước của Chunk lớn hơn khối dữ liệu hiện tại, lấy hết khối*/
    959.             if (state->ChunkLength >= inLength)
    960.             {
    961.                 memcpy(posOut, posIn, inLength * sizeof(char));
    962.                 state->ChunkLength -= inLength;
    963.  
    964.                 posOut += inLength;
    965.                 outLength += inLength;
    966.  
    967.                 /*  Đã lấy hết Chunk. */
    968.                 if (state->ChunkLength == 0)
    969.                     state->Chunk = false;
    970.                 inLength = 0;
    971.             }
    972.             else
    973.             {
    974.                 memcpy(posOut, posIn, state->ChunkLength * sizeof(char));
    975.                 inLength -= state->ChunkLength;
    976.                 posIn += state->ChunkLength;
    977.                 posOut += state->ChunkLength;
    978.                 outLength += state->ChunkLength;
    979.  
    980.                 state->Chunk = false;
    981.                 state->ChunkLength = 0;
    982.             }
    983.         }
    984.     }
    985.     while(inLength >0);
    986.  
    987.     memset(data, 0, length * sizeof(char));
    988.     memcpy(data, out, outLength * sizeof(char));
    989.     length = outLength;
    990.     delete[] out;
    991. }
    Đã được chỉnh sửa lần cuối bởi doicanhden : 28-06-2011 lúc 07:08 PM.
    Kết bạn với tôi <3
    Skype: giautm
    Facebook:
    https://fb.com/giautm.duongntt
    Email:
    giau.tmg@gmail.com

  4. #4
    Ngày gia nhập
    08 2009
    Bài viết
    15

    Trích dẫn Nguyên bản được gửi bởi meoconlongvang Xem bài viết
    Tại thời điểm bạn gọi hảm WSAEnumNetworkEvents, bạn vẫn chưa gửi dữ liệu. Sau khi gọi hàm đó xong, bạn mới kiểm tra điều kiện và gọi hàm send lên server. Vì bạn chưa send gì lên server nên server cũng chẳng có gì để trả cho bạn cả, và do đó FD_READ ko xảy ra. Nếu sau khi send xong, bạn recv ngay thì chắc chắn sẽ có html. Nhưng bạn lại kiểm tra điều kiện if(NetworkEvents.lNetworkEvents & FD_READ), và ko recv. Như vậy chương trình bị sai logic ngay từ đoạn WSAEnumNetworkEvents và dẫn tới sai luôn chỗ kiểm tra điều kiện phía dưới.
    Cám ơn bác đã vào xem giúp em ..... Nhưng em nghĩ bác chắc chưa xem kỹ nếu có thời gian bác run thử và cout<< số byt gửi và bác cout<<rebuf.... ra xem thử !
    C++ Code:
    1.  int gui =    send( ConnectSocket, relink, (int)strlen(relink), 0 ); // check cuoi cung
    2.                                                                             cout<<gui;
    bác sẽ thấy là nó gửi rồi ...

    mong bác tiếp tục giúp đỡ em ạ !



    Tiếp nhận ý kiến của bác em cũng đã thấy mình ngu đoạn ....để hàm recv() sau if(NetworkEvents.lNetworkEvents & FD_READ) ;
    Em chỉnh lại thành ( khi xuất hiện sự kiện gửi ....mới cho phép nhận - gọi hàm Recv )
    :
    C++ Code:
    1.         // ==========================Het phan su kien connect =======================
    2.          if(NetworkEvents.lNetworkEvents & FD_WRITE)
    3.         {
    4.             if(NetworkEvents.iErrorCode[FD_WRITE_BIT] == 0)
    5.             {
    6.                 cout<<" Dang gui Request toi sever .....\n";
    7.                 // nhan du lieu ......
    8.                                                                             size_t by_nhan;
    9.                                         do{
    10.                                    
    11.                                          by_nhan = recv(ConnectSocket, recvbuf, sizeof(recvbuf)-1, 0);
    12.                                        
    13.                                         if(by_nhan<0){
    14.                                            
    15.                                         break;
    16.                                         }
    17.                                         recvbuf[by_nhan]=0;
    18.                                         //cout<<recvbuf;                                            
    19.                                         }
    20.                                         while(by_nhan>0);
    21.  
    22.             }
    23.             else{
    24.                 cout<<"Loi su kien gui ......"<<WSAGetLastError()<<endl;
    25.             }
    26.         }
    27.  
    28.         //esle{cout<<"Chua "<<endl;}
    29.         //===========================Het su kien gui ....============================

    kết quả em run thử vẫn không thông báo sự kiện FD_READ ạ !
    Đã được chỉnh sửa lần cuối bởi zhukov : 19-06-2011 lúc 06:04 PM.

  5. #5
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Bạn chưa hiểu ý mình rồi. Mình đã chạy thử rồi đấy chứ. Send vẫn thành công. Nhưng cái sai ko phải ở chỗ FD_READ hay FD_WRITE mà là bạn gọi hàm WSAEnumNetworkEvents trước khi send. Sau khi send xong, sự kiện FD_READ mới xảy ra và bạn phải gọi lại WSAEnumNetworkEvents để kiểm tra sự kiện tiếp theo mới đúng.

    Có 1 điều mình ko rõ ở đây là bạn phải dùng WSAWait/Event để làm gì ? Nếu chưa có dữ liệu thì hàm recv sẽ tự động dừng lại và chờ cho đến khi có dữ liệu nó mới qua. Những đoạn code wait của bạn đều ko có ý nghĩa gì trong đoạn chương trình này cả.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  6. #6
    Ngày gia nhập
    08 2009
    Bài viết
    15

    Mặc định Bị lỗi phần sử lý sự kiện trong thư viện winsock2.h ! Xin cac bác giúp đỡ

    Trích dẫn Nguyên bản được gửi bởi meoconlongvang Xem bài viết
    Bạn chưa hiểu ý mình rồi. Mình đã chạy thử rồi đấy chứ. Send vẫn thành công. Nhưng cái sai ko phải ở chỗ FD_READ hay FD_WRITE mà là bạn gọi hàm WSAEnumNetworkEvents trước khi send. Sau khi send xong, sự kiện FD_READ mới xảy ra và bạn phải gọi lại WSAEnumNetworkEvents để kiểm tra sự kiện tiếp theo mới đúng.

    Có 1 điều mình ko rõ ở đây là bạn phải dùng WSAWait/Event để làm gì ? Nếu chưa có dữ liệu thì hàm recv sẽ tự động dừng lại và chờ cho đến khi có dữ liệu nó mới qua. Những đoạn code wait của bạn đều ko có ý nghĩa gì trong đoạn chương trình này cả.
    Dạ ko sai bác à ! thực tế em chỉ muốn test cho các function chạy đúng ....còn về nguyên tắc . Sử lý sự kiện mạng này em sẽ dùng cho một điều gì đó phức tạp hơn cần đến Chồng chéo ( I/O ) bác à ! hi vọng sẽ được bác giúp đỡ trong tương lai trong trường hợp sảy ra những " rào cản của sự hiểu biết nhất thời "
    Thank bác !

  7. #7
    Ngày gia nhập
    04 2010
    Nơi ở
    Binh Thanh, Hồ Chí Minh, Vietnam, Vietnam
    Bài viết
    504

    bác cho đoạn này vào một vòng lặp do... while là đc
    C Code:
    1. do
    2. {
    3. if(WSAEnumNetworkEvents(ConnectSocket,EventArray[index-WSA_WAIT_EVENT_0],&NetworkEvents)!=
    4. SOCKET_ERROR)
    5. {
    6.       .................
    7. }
    8. else
    9. {
    10.       .................
    11. }
    12. }while(true);
    Bác ấy kiểm tra dữ liệu trước khi đọc để tránh tình trạng chương trình bị treo khi nhận dữ liệu. @@.
    Nếu chưa có dữ liệu thì hàm recv sẽ tự động dừng lại và chờ cho đến khi có dữ liệu nó mới qua.
    Chờ đến khi nào hả bác? Không có timeout thì chờ đến tết àk? Server không gửi dữ liệu đến thì treo cả app.
    Kết bạn với tôi <3
    Skype: giautm
    Facebook:
    https://fb.com/giautm.duongntt
    Email:
    giau.tmg@gmail.com

  8. #8
    Ngày gia nhập
    08 2009
    Bài viết
    15

    Trích dẫn Nguyên bản được gửi bởi doicanhden Xem bài viết
    bác cho đoạn này vào một vòng lặp do... while là đc
    C Code:
    1. do
    2. {
    3. if(WSAEnumNetworkEvents(ConnectSocket,EventArray[index-WSA_WAIT_EVENT_0],&NetworkEvents)!=
    4. SOCKET_ERROR)
    5. {
    6.       .................
    7. }
    8. else
    9. {
    10.       .................
    11. }
    12. }while(true);
    Bác ấy kiểm tra dữ liệu trước khi đọc để tránh tình trạng chương trình bị treo khi nhận dữ liệu. @@.

    Chờ đến khi nào hả bác? Không có timeout thì chờ đến tết àk? Server không gửi dữ liệu đến thì treo cả app.
    Thực ra tôi gét phải sử dụng cách tới vòng lặp !
    lên cố viết một cách khác ....theo nguyên tắc thì đúng thế ....Tôi đã sử dụng vòng lặp trước đó và dĩ nhiên như bác nói mọi chuyện rất ổn . Tuy nhiên một câu hỏi đặt ra là " nhất thiết phải sử dụng vòng lặp không ? " nếu trong một ứng dụng yêu cầu quá khắt khe chẳng hạn ...tôi nghĩ cái vòng lặp nếu bỏ đi được chắc chắn sẽ tốt hơn

  9. #9
    Ngày gia nhập
    08 2009
    Bài viết
    15

    Trích dẫn Nguyên bản được gửi bởi doicanhden Xem bài viết
    bác cho đoạn này vào một vòng lặp do... while là đc
    C Code:
    1. do
    2. {
    3. if(WSAEnumNetworkEvents(ConnectSocket,EventArray[index-WSA_WAIT_EVENT_0],&NetworkEvents)!=
    4. SOCKET_ERROR)
    5. {
    6.       .................
    7. }
    8. else
    9. {
    10.       .................
    11. }
    12. }while(true);
    Bác ấy kiểm tra dữ liệu trước khi đọc để tránh tình trạng chương trình bị treo khi nhận dữ liệu. @@.

    Chờ đến khi nào hả bác? Không có timeout thì chờ đến tết àk? Server không gửi dữ liệu đến thì treo cả app.
    Thực ra em gét phải sử dụng cách tới vòng lặp !
    lên cố viết một cách khác ....theo nguyên tắc thì đúng thế ....em đã sử dụng vòng lặp trước đó và dĩ nhiên như bác nói mọi chuyện rất ổn . Tuy nhiên một câu hỏi đặt ra là " nhất thiết phải sử dụng vòng lặp không ? " nếu trong một ứng dụng yêu cầu quá khắt khe chẳng hạn ...em nghĩ cái vòng lặp nếu bỏ đi được chắc chắn sẽ tốt hơn
    Có lẽ đây chỉ là ở Client lên em nghĩ chắc như dưới đây em chắc cũng đã có thể có kết quả như mong muốn ! ko sử dụng vòng lặp ...sau mấy ngày ngồi chán bỏ cuộc nay tự nhiên vào suy nghĩ lại có mới phát hiện cần gọi lại 2 hàm Waitfor và EnumNet...
    để " cập nhật sự kiện " không biết các bác có ý kiến gì về đoạn code của em đúng sai và điểm ko hay , em xin lĩnh ý !
    C++ Code:
    1. #include "stdafx.h"
    2. #ifndef UNICODE
    3. #define UNICODE
    4. #endif
    5.  
    6. #define WIN32_LEAN_AND_MEAN
    7. #include <iostream>
    8. #include <stdio.h>
    9. #include <winsock2.h>
    10. #include <fstream>
    11. #pragma comment (lib,"ws2_32.lib")
    12. using namespace std;
    13.  
    14. #define DEFAULT_BUFLEN 257
    15. #define DEFAULT_PORT 80
    16. void send_http(SOCKET ConnectSocket)
    17. {
    18.     char * get = "GET /default.aspx?tabid=325 HTTP/1.1\r\n";
    19.     char * hots = "Host: nuocnga.net\r\n";
    20.     char *use_agen = "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.17) Gecko/20110420 Firefox/3.6.17\r\n";
    21.     char *st = "Connection: Keep-Alive\r\n";
    22.     char * acc_encoding ="Accept-Encoding: gzip\r\n";
    23.     char * acc_languege = "Accept-Charset: ISO-8859-1,UTF-8;q=0.7,*;q=0.7\r\n";
    24.     char *cache = "Cache-Control: no-cache\r\n";
    25.     char  *relink = "Referer: http://google.com/\r\n\r\n";
    26.     // gui ...du lieu
    27.  
    28.                                                                                 send( ConnectSocket, get, (int)strlen(get), 0 );
    29.                                                                                 send( ConnectSocket, hots, (int)strlen(hots), 0 );
    30.                                                                                 send( ConnectSocket, acc_encoding, (int)strlen(acc_encoding), 0 );
    31.                                                                                 send( ConnectSocket, acc_languege, (int)strlen(acc_languege), 0 );
    32.                                                                                 send( ConnectSocket, cache, (int)strlen(cache), 0 );
    33.                                                                                 send( ConnectSocket, st, (int)strlen(st), 0 );
    34.                                                                                 send( ConnectSocket, use_agen, (int)strlen(use_agen), 0 );
    35.                                                                                 send( ConnectSocket, relink, (int)strlen(relink), 0 );
    36.  
    37.  
    38.  
    39. }
    40. /////////////////////////////////////////////////////////////////
    41. int main() {
    42.  
    43. // Khai báo kh?i t?o socket
    44.     int iResult;
    45.     WSADATA wsaData;
    46.     hostent *ConnectPC=NULL;
    47.     fstream file;
    48.     struct sockaddr_in clientService;
    49.  
    50.     size_t new_size;
    51.     SOCKET ConnectSocket;
    52.     char recvbuf[DEFAULT_BUFLEN] = {0};
    53.     WSAPROTOCOL_INFO *lpProtocolBuf = NULL;
    54.     DWORD dwErr,dwBufLen = 0;
    55.     // Khai báo thông s? cho s? lý s? ki?n
    56.     DWORD event_total=0;
    57.     DWORD index;
    58.     WSAEVENT EventArray[WSA_MAXIMUM_WAIT_EVENTS],new_event;
    59.     WSANETWORKEVENTS NetworkEvents;
    60.  
    61.     //----------------------
    62.  
    63.     iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
    64.     if (iResult != NO_ERROR) {
    65.         wprintf(L"WSAStartup failed with error: %d\n", iResult);
    66.        
    67.     }
    68.     // ===============bo dem ======================
    69.           int nRet = WSAEnumProtocols(NULL, lpProtocolBuf, &dwBufLen);
    70.           if(nRet != SOCKET_ERROR){
    71.          
    72.               cout<<"goi lan 1\n";
    73.           }
    74.           else if((dwErr = WSAGetLastError()) != WSAENOBUFS){
    75.  
    76.               cout<<"WSAEnumProtocols() failed with code %d\n"<<WSAGetLastError();
    77.           }
    78.           else{
    79.               cout<<"is ok\n";
    80.               lpProtocolBuf = (WSAPROTOCOL_INFO *)malloc(dwBufLen);
    81.               if (lpProtocolBuf)
    82.               {
    83.                   nRet = WSAEnumProtocols(NULL, lpProtocolBuf, &dwBufLen);
    84.                   if (nRet == SOCKET_ERROR)
    85.                   {
    86.                       printf("WSAEnumProtocols() failed with code %d\n", WSAGetLastError());
    87.                   }
    88.                   else
    89.                   {
    90.                       cout<<"rat ok\n";
    91.                   }
    92.               }
    93.           }
    94.  
    95.     ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    96.     if (ConnectSocket == INVALID_SOCKET) {
    97.         wprintf(L"socket failed with error: %ld\n", WSAGetLastError());
    98.         WSACleanup();
    99.         return 1;
    100.     }
    101.     char * domain ="nuocnga.net";
    102.        
    103.         ConnectPC = gethostbyname(domain);
    104.     clientService.sin_family = AF_INET;
    105.     clientService.sin_addr.s_addr = (*(DWORD*)ConnectPC->h_addr_list[0]);
    106.     clientService.sin_port = htons( DEFAULT_PORT );
    107.  
    108.     iResult = connect( ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService) );
    109.     if (iResult == SOCKET_ERROR) {
    110.         wprintf(L"connect failed with error: %d\n", WSAGetLastError() );
    111.         closesocket(ConnectSocket);
    112.         WSACleanup();
    113.         return 1;
    114.   }
    115.     ///////////////////////////////
    116.  
    117.     //char * header_re ="GET / HTTP/1.1\r\n\nHost: www.hvaonline.net\r\nConnection: Keep-Alive\r\nUser-Agent: Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.8 (like Gecko)\r\nAccept-Encoding: gzip,deflate,sdch\r\nAccept-Language: vi-VN,vi;q=0.8,fr-FR;q=0.6,fr;q=0.4,en-US;q=0.2,en;q=0.2\r\n\r\n";
    118.     //----------------------
    119.  
    120.  
    121.     //=======================================Ph?n s? lý các s? ki?n ==========================================
    122.    
    123.     EventArray[event_total] = WSACreateEvent();
    124.     //new_event = WSACreateEvent();
    125.     // ch?n s? ki?n m?ng
    126.     //  EventArray[event_total]=new_event;
    127.     WSAEventSelect(ConnectSocket,EventArray[event_total],FD_CONNECT | FD_WRITE | FD_READ);
    128.     event_total++;
    129.  
    130.  
    131.     index = WSAWaitForMultipleEvents(event_total, EventArray, FALSE, WSA_INFINITE, FALSE); // trả về tổng số các sự kiện .....
    132.  
    133.    
    134.           WSAEnumNetworkEvents(ConnectSocket,EventArray[index - WSA_WAIT_EVENT_0],&NetworkEvents);
    135.      cout<<"kukuchima\n";
    136.              if(NetworkEvents.lNetworkEvents & FD_CONNECT)
    137.         {
    138.             if (NetworkEvents.iErrorCode[FD_CONNECT_BIT] == 0){
    139.                 cout<<"xuat hien mot yeu cau ket noi .... \n";
    140.                 send_http(ConnectSocket);
    141.  
    142.             }
    143.             else{
    144.                 cout<<"Loi su kien connect ! ma loi ..."<<WSAGetLastError()<<endl;
    145.             }
    146.         }
    147.  
    148.                       //======================================
    149.          if(NetworkEvents.lNetworkEvents & FD_WRITE)
    150.         {
    151.             if(NetworkEvents.iErrorCode[FD_WRITE_BIT] == 0)
    152.             {
    153.                 cout<<" Dang gui Request toi sever .....\n";
    154.                 // gọi lại WSAWaitformuti ....EnumNetWork và sử lý lại sự kiện ....
    155.                 index = WSAWaitForMultipleEvents(event_total, EventArray, FALSE, WSA_INFINITE, FALSE);
    156.                 WSAEnumNetworkEvents(ConnectSocket,EventArray[index - WSA_WAIT_EVENT_0],&NetworkEvents);
    157.             }
    158.             else{
    159.                 cout<<"Loi su kien gui ......"<<WSAGetLastError()<<endl;
    160.             }
    161.         }
    162.         //esle{cout<<"Chua "<<endl;}
    163.                      //===============================================
    164.         if(NetworkEvents.lNetworkEvents & FD_READ)
    165.         {
    166.          if(NetworkEvents.iErrorCode[FD_READ_BIT] == 0)
    167.             {
    168.                 cout<<" Dang doc du lieu gui ve .....\n";
    169.                                        // doc du lieu o day
    170.        
    171.  
    172.                                                              
    173.                                                              
    174.  
    175.             }
    176.             else
    177.             {
    178.                 cout<<"Loi su kien doc du lieu .....\n";
    179.             }
    180.         }
    181.  
    182.  
    183.  
    184.     iResult = closesocket(ConnectSocket);
    185.     if (iResult == SOCKET_ERROR) {
    186.         wprintf(L"close failed with error: %d\n", WSAGetLastError());
    187.         WSACleanup();
    188.         return 1;
    189.     }
    190.     free(lpProtocolBuf);
    191.     WSACleanup();
    192.    
    193.     cin>>iResult;
    194.     return iResult;
    195.    
    196.     }

  10. #10
    Ngày gia nhập
    04 2010
    Nơi ở
    Binh Thanh, Hồ Chí Minh, Vietnam, Vietnam
    Bài viết
    504

    Hok hiểu câu này của bạn? edit lại nhé, phải là kết nối thành công chứ, mới đọc cứ nghĩ bạn làm sever
    cout<<"xuat hien mot yeu cau ket noi .... \n";
    còn một vấn đề nữa, do bạn dùng HTTP ver 1.1 nên sẽ có thêm Chunked_transfer_encoding. Lúc đó server sẽ gửi dữ liệu về theo từng đoạn, dữ liệu bị chia ra, bạn sẽ không bao giờ đọc hết giữ liệu một lần đc.
    @Nếu bác không thích xài vòng lặp thì chơi kiểu "thổ dân" đi
    C++ Code:
    1. _loop:
    2. if (true)
    3.     goto _loop;
    Đã được chỉnh sửa lần cuối bởi doicanhden : 28-06-2011 lúc 07:05 PM. Lý do: [b]...............................[/b]
    Kết bạn với tôi <3
    Skype: giautm
    Facebook:
    https://fb.com/giautm.duongntt
    Email:
    giau.tmg@gmail.com

Các đề tài tương tự

  1. MIME trong winsock2 ?
    Gửi bởi MartSoft trong diễn đàn Windows API, Hooking, xử lý Windows Message
    Trả lời: 0
    Bài viết cuối: 09-07-2010, 10:25 AM
  2. Không thể thêm đối tượng WSADATA (sử dụng WinSock2.h) vào class
    Gửi bởi hirosama trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 0
    Bài viết cuối: 13-04-2010, 12:26 AM
  3. Borland C++ Lỗi Thư viện winsock,winsock2
    Gửi bởi tauit_dnmd trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 05-04-2010, 08:49 PM
  4. Lập trình socket trong C | cách sử dụng Winsock2 với C-Program
    Gửi bởi Kevin Hoang trong diễn đàn Thủ thuật, Tutorials và Mã nguồn C/C++/C++0x
    Trả lời: 0
    Bài viết cuối: 09-08-2008, 11:59 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn