Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 6 của 6
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    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

    Mã:
    // news.cpp : Defines the entry point for the console application.// #include "stdafx.h"#ifndef UNICODE#define UNICODE#endif #define WIN32_LEAN_AND_MEAN#include <iostream>#include <stdio.h>#include <winsock2.h>#include <fstream>#pragma comment (lib,"ws2_32.lib")using namespace std; #define DEFAULT_BUFLEN 257#define DEFAULT_PORT 80 int main() { // Khai báo kh?i t?o socket    int iResult;    WSADATA wsaData;    hostent *ConnectPC=NULL;    fstream file;    struct sockaddr_in clientService;      size_t new_size;    SOCKET ConnectSocket;    char recvbuf[DEFAULT_BUFLEN] = {0};    WSAPROTOCOL_INFO *lpProtocolBuf = NULL;    DWORD dwErr,dwBufLen = 0;    // Khai báo thông s? cho s? lý s? ki?n    DWORD event_total=0;    DWORD index;    WSAEVENT EventArray[WSA_MAXIMUM_WAIT_EVENTS],new_event;    WSANETWORKEVENTS NetworkEvents;     //----------------------     iResult = WSAStartup(MAKEWORD(2,2), &wsaData);    if (iResult != NO_ERROR) {        wprintf(L"WSAStartup failed with error: %d
    ", iResult);           }    // ===============bo dem ======================          int nRet = WSAEnumProtocols(NULL, lpProtocolBuf, &dwBufLen);          if(nRet != SOCKET_ERROR){                        cout<<"goi lan 1
    ";          }          else if((dwErr = WSAGetLastError()) != WSAENOBUFS){               cout<<"WSAEnumProtocols() failed with code %d
    "<<WSAGetLastError();          }          else{              cout<<"is ok
    ";              lpProtocolBuf = (WSAPROTOCOL_INFO *)malloc(dwBufLen);              if (lpProtocolBuf)              {                  nRet = WSAEnumProtocols(NULL, lpProtocolBuf, &dwBufLen);                  if (nRet == SOCKET_ERROR)                  {                      printf("WSAEnumProtocols() failed with code %d
    ", WSAGetLastError());                  }                  else                  {                      cout<<"rat ok
    ";                  }              }          }     ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);    if (ConnectSocket == INVALID_SOCKET) {        wprintf(L"socket failed with error: %ld
    ", WSAGetLastError());        WSACleanup();        return 1;    }    char * domain ="nuocnga.net";                ConnectPC = gethostbyname(domain);    clientService.sin_family = AF_INET;    clientService.sin_addr.s_addr = (*(DWORD*)ConnectPC->h_addr_list[0]);    clientService.sin_port = htons( DEFAULT_PORT );     iResult = connect( ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService) );    if (iResult == SOCKET_ERROR) {        wprintf(L"connect failed with error: %d
    ", WSAGetLastError() );        closesocket(ConnectSocket);        WSACleanup();        return 1;  }    ///////////////////////////////     //char * header_re ="GET / HTTP/1.1
    
    Host: www.hvaonline.net
    Connection: Keep-Alive
    User-Agent: Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.8 (like Gecko)
    Accept-Encoding: gzip,deflate,sdch
    Accept-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
    
    ";    //----------------------    char * get = "GET /default.aspx?tabid=325 HTTP/1.1
    ";    char * hots = "Host: nuocnga.net
    ";    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
    ";    char *st = "Connection: Keep-Alive
    ";    char * acc_encoding ="Accept-Encoding: gzip
    ";    char * acc_languege = "Accept-Charset: ISO-8859-1,UTF-8;q=0.7,*;q=0.7
    ";    char *cache = "Cache-Control: no-cache
    ";    char  *relink = "Referer: http://google.com/
    
    ";    // gui ...du lieu     send( ConnectSocket, get, (int)strlen(get), 0 );    send( ConnectSocket, hots, (int)strlen(hots), 0 );    send( ConnectSocket, acc_encoding, (int)strlen(acc_encoding), 0 );    send( ConnectSocket, acc_languege, (int)strlen(acc_languege), 0 );    //send( ConnectSocket, cache, (int)strlen(cache), 0 );    send( ConnectSocket, st, (int)strlen(st), 0 );    send( ConnectSocket, use_agen, (int)strlen(use_agen), 0 );     size_t by_gui = send( ConnectSocket, relink, (int)strlen(relink), 0 );     cout<<by_gui;     // Nhan du lieu                                            do{                                                                            iResult = recv(ConnectSocket, recvbuf, sizeof(recvbuf)-1, 0);                                                                                if(iResult<0){                                                                                    break;                                        }                                        recvbuf[iResult]=0;                                        cout<<recvbuf;                                                               }while(iResult>0);       iResult = closesocket(ConnectSocket);    if (iResult == SOCKET_ERROR) {        wprintf(L"close failed with error: %d
    ", WSAGetLastError());        WSACleanup();        return 1;    }    free(lpProtocolBuf);    WSACleanup();        cin>>iResult;    return iResult;        }
    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ề .!

    Mã:
    int main() { // Khai báo kh?i t?o socket    int iResult;    WSADATA wsaData;    hostent *ConnectPC=NULL;    fstream file;    struct sockaddr_in clientService;      size_t new_size;    SOCKET ConnectSocket;    char recvbuf[DEFAULT_BUFLEN] = {0};    WSAPROTOCOL_INFO *lpProtocolBuf = NULL;    DWORD dwErr,dwBufLen = 0;    // Khai báo thông s? cho s? lý s? ki?n    DWORD event_total=0;    DWORD index;    WSAEVENT EventArray[WSA_MAXIMUM_WAIT_EVENTS],new_event;    WSANETWORKEVENTS NetworkEvents;     //----------------------     iResult = WSAStartup(MAKEWORD(2,2), &wsaData);    if (iResult != NO_ERROR) {        wprintf(L"WSAStartup failed with error: %d
    ", iResult);           }    // ===============bo dem ======================          int nRet = WSAEnumProtocols(NULL, lpProtocolBuf, &dwBufLen);          if(nRet != SOCKET_ERROR){                        cout<<"goi lan 1
    ";          }          else if((dwErr = WSAGetLastError()) != WSAENOBUFS){               cout<<"WSAEnumProtocols() failed with code %d
    "<<WSAGetLastError();          }          else{              cout<<"is ok
    ";              lpProtocolBuf = (WSAPROTOCOL_INFO *)malloc(dwBufLen);              if (lpProtocolBuf)              {                  nRet = WSAEnumProtocols(NULL, lpProtocolBuf, &dwBufLen);                  if (nRet == SOCKET_ERROR)                  {                      printf("WSAEnumProtocols() failed with code %d
    ", WSAGetLastError());                  }                  else                  {                      cout<<"rat ok
    ";                  }              }          }     ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);    if (ConnectSocket == INVALID_SOCKET) {        wprintf(L"socket failed with error: %ld
    ", WSAGetLastError());        WSACleanup();        return 1;    }    char * domain ="nuocnga.net";                ConnectPC = gethostbyname(domain);    clientService.sin_family = AF_INET;    clientService.sin_addr.s_addr = (*(DWORD*)ConnectPC->h_addr_list[0]);    clientService.sin_port = htons( DEFAULT_PORT );     iResult = connect( ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService) );    if (iResult == SOCKET_ERROR) {        wprintf(L"connect failed with error: %d
    ", WSAGetLastError() );        closesocket(ConnectSocket);        WSACleanup();        return 1;  }    ///////////////////////////////     //char * header_re ="GET / HTTP/1.1
    
    Host: www.hvaonline.net
    Connection: Keep-Alive
    User-Agent: Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.8 (like Gecko)
    Accept-Encoding: gzip,deflate,sdch
    Accept-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
    
    ";    //----------------------    char * get = "GET /default.aspx?tabid=325 HTTP/1.1
    ";    char * hots = "Host: nuocnga.net
    ";    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
    ";    char *st = "Connection: Keep-Alive
    ";    char * acc_encoding ="Accept-Encoding: gzip
    ";    char * acc_languege = "Accept-Charset: ISO-8859-1,UTF-8;q=0.7,*;q=0.7
    ";    char *cache = "Cache-Control: no-cache
    ";    char  *relink = "Referer: http://google.com/
    
    ";    // gui ...du lieu     //=======================================Ph?n s? lý các s? ki?n ==========================================        EventArray[event_total] = WSACreateEvent();    /ew_event = WSACreateEvent();    // ch?n s? ki?n m?ng     //  EventArray[event_total]=new_event;    WSAEventSelect(ConnectSocket,EventArray[event_total],FD_CONNECT | FD_WRITE | FD_READ);    event_total++;      index = WSAWaitForMultipleEvents(event_total, EventArray, FALSE, WSA_INFINITE, FALSE);    if(WSAEnumNetworkEvents(ConnectSocket,EventArray[index-WSA_WAIT_EVENT_0],&NetworkEvents)!= SOCKET_ERROR){         cout<<"Enum ..is ok
    ";        if(NetworkEvents.lNetworkEvents & FD_CONNECT)        {            if (NetworkEvents.iErrorCode[FD_CONNECT_BIT] == 0){                cout<<"xuat hien mot yeu cau ket noi .... 
    ";                                                                            // Gui du lieu ......                                                                                send( ConnectSocket, get, (int)strlen(get), 0 );                                                                                send( ConnectSocket, hots, (int)strlen(hots), 0 );                                                                                send( ConnectSocket, acc_encoding, (int)strlen(acc_encoding), 0 );                                                                                send( ConnectSocket, acc_languege, (int)strlen(acc_languege), 0 );                                                                                send( ConnectSocket, cache, (int)strlen(cache), 0 );                                                                                send( ConnectSocket, st, (int)strlen(st), 0 );                                                                                send( ConnectSocket, use_agen, (int)strlen(use_agen), 0 );                                                                                send( ConnectSocket, relink, (int)strlen(relink), 0 );            }            else{                cout<<"Loi su kien connect ! ma loi ..."<<WSAGetLastError()<<endl;            }        }        // ==========================Het phan su kien connect =======================         if(NetworkEvents.lNetworkEvents & FD_WRITE)        {            if(NetworkEvents.iErrorCode[FD_WRITE_BIT] == 0)            {                cout<<" Dang gui Request toi sever .....
    ";            }            else{                cout<<"Loi su kien gui ......"<<WSAGetLastError()<<endl;            }        }        //esle{cout<<"Chua "<<endl;}        //===========================Het su kien gui ....============================         if(NetworkEvents.lNetworkEvents & FD_READ)        {            if(NetworkEvents.iErrorCode[FD_READ_BIT] == 0)            {                cout<<" Dang doc du lieu gui ve .....
    ";                                       // doc du lieu o day                size_t by_nhan;                                        do{                                                                             by_nhan = recv(ConnectSocket, recvbuf, sizeof(recvbuf)-1, 0);                                                                                if(by_nhan<0){                                                                                    break;                                        }                                        recvbuf[by_nhan]=0;                                        cout<<recvbuf;                         // in ket qua ....                                                             }                                        while(by_nhan>0);                                                                                                                                       }            else            {                cout<<"Loi su kien doc du lieu .....
    ";            }        }        //==============================Het su kien doc du lieu ......================        }    else    {        cout<<" khong co su kien nao or tiep theo .......
     "<<WSAGetLastError();    }       //========================================================================================================     iResult = closesocket(ConnectSocket);    if (iResult == SOCKET_ERROR) {        wprintf(L"close failed with error: %d
    ", WSAGetLastError());        WSACleanup();        return 1;    }    free(lpProtocolBuf);    WSACleanup();        cin>>iResult;    return iResult;        }
    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ạ !

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    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.

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    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ý [IMG]images/smilies/smile.png[/IMG]
    Header: https.h

    Mã:
    #ifndef __HTTPS_PROTOCOL_H_82DDD139689B8D73C15C6165472A8E14__INCLUDED_    #define __HTTPS_PROTOCOL_H_82DDD139689B8D73C15C6165472A8E14__INCLUDED_    #include <string.h>    #include <malloc.h>     #include "winsock2.h"               // Thư viện Winsock 2    #pragma comment (lib,"ws2_32.lib")  // Thư viện Winsock 2    #include "openssl/ssl.h"            // Thư viện OpenSSL    #pragma comment (lib,"ssleay32.lib")// Thư viện OpenSSL    class HTTPS {        public:            HTTPS();            ~HTTPS();            char* Host() const;            bool Host(const char* pHost);                    char* Version() const;            bool Version(const char* pVersion);                    char* UserAgent() const;            bool UserAgent(const char* pUserAgent);             char* Accept() const;            bool Accept(const char* pUserAgent);             char* AcceptLanguage() const;            bool AcceptLanguage(const char* pUserAgent);             char* AcceptCharset() const;            bool AcceptCharset(const char* pUserAgent);             char* Header() const;            char* HeaderField(const char* pFieldName,int& iPos) const;             char* Cookie(const char* pKey) const;            bool Cookie(const char* pKey,const char* pValue);             char* Body(long& lLength) const;            bool Body(const char* pBody,long lLength);             bool Request(const char* szMethod,const char* szRequest,bool bAttachBody = false,bool bAttachFromFile = false,bool bResponseToFile = false);                    int Open();            int Open(const char* pHost,int iPort,bool bUseSSL=false,bool bKeepAlive=false)            {                Host(pHost);                Port(iPort);                this->bUseSSL = bUseSSL;                this->bKeepAlive = bKeepAlive;                return Open();            }            bool Close();            unsigned long TimeOut() const            {                return lTimeOut;            }            void TimeOut(unsigned long lTimeOut)            {                this->lTimeOut=lTimeOut;            }            unsigned short Post() const            {                return iPort;            }            void Port(unsigned short iPort)            {                this->iPort = iPort;            }            bool KeepAlive() const            {                return bKeepAlive;            }            void KeepAlive(bool bKeepAlive)            {                this->bKeepAlive=bKeepAlive;            }            bool UseSSL() const            {                return bUseSSL;            }            void UseSSL(bool bUseSSL)            {                this->bUseSSL=bUseSSL;            }            int StatusCode() const            {                return iStatusCode;            }            void FileToAttach(FILE *file)            {                fileAttach = file;            }            void FileToResponse(FILE *file)            {                fileResponse = file;            }            void Clear();            void Reset();            void Default();            void Close(bool bClearAll=false);        private:            typedef struct _ChunkState            {                long ChunkLength;                bool Chunk;            }ChunkState,* PChunkState;                         unsigned short  iPort;            unsigned long   lTimeOut;            bool            receivelData(bool bSaveToFile);             // Hàm nhận dữ liệu trả về.            bool            getstatusCode();            // Hàm lấy mã trạng thái của giao thức HTTP.            bool            processCookie();            // Hàm trích chuỗi Cookie từ Header            int             CreateRequest(char*& pPack,const char* pMethod,const char* pRequest) const; // Hàm tạo phần Request            void            RequestField(char*& pPack,const char* pKey,const char* pValue) const; // Hàm thêm các trường vào request            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            void            DecodeChunked(PChunkState state,char *data,long &length,bool &bExit) const;            char            *szHost;            char            *szHeader;            char            *szBody;            char            *szUserAgent;            char            *szAccept;            char            *szAcceptCharset;            char            *szAcceptLanguage;            char            *szVersion;            char            *szCookie;                  // Lưu Cookie             FILE            *fileAttach;            FILE            *fileResponse;            int             iStatusCode;            int             iSocket;    //      long            lHeaderLength;            long            lBodyLength;            bool            bUseSSL;            bool            bKeepAlive;            bool            bConnected;            SSL             *ssl;                       //Kết nối SSL, dùng thư viện OpenSSL.    };#endif
    Source: https.cpp

    Mã:
    #include "stdafx.h" #include "https.h" #define BUFFSIZE 4096 /* 4Kbytes */#define MIN(a,b) (a<b)?a:b#define HTTP_UserAgent "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1)"#define HTTP_Version "1.1"#define HTTP_Accept "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"#define HTTP_AcceptLanguage "en-us"#define HTTP_AcceptCharset "UTF-8,*"         HTTPS::HTTPS(){    szHost = NULL;    szCookie = NULL; // Lưu Cookie    szHeader = NULL;    szBody = NULL;    fileAttach = NULL;    fileResponse = NULL;    lTimeOut = 10000;    szAccept = _strdup(HTTP_Accept);    szAcceptCharset = _strdup(HTTP_AcceptCharset);    szAcceptLanguage = _strdup(HTTP_AcceptLanguage);    szUserAgent = _strdup(HTTP_UserAgent);    szVersion = _strdup(HTTP_Version);    lBodyLength = 0;    bKeepAlive = false;    bUseSSL = false;    WSADATA SData;    WSAStartup(0x0202,&SData);//Không thể khởi động Winsock, thoát.}        HTTPS::~HTTPS(){    delete [] szAccept;    szAccept = NULL;     delete [] szAcceptCharset;    szAcceptCharset = NULL;     delete [] szAcceptLanguage;    szAcceptLanguage = NULL;     delete [] szUserAgent;    szUserAgent = NULL;     delete [] szVersion;    szVersion = NULL;     delete [] szHost;    szHost = NULL;     delete [] szHeader;    szHeader = NULL;     delete [] szBody;    szBody = NULL;     delete [] szCookie;    szCookie = NULL;     if (bUseSSL)    {        SSL_free(ssl);          // Nếu có kết nối SSL thì đóng.        ssl = NULL;    }}int     HTTPS::CreateRequest(char*& pPack,const char* pMethod,const char* pRequest) const {    int iLen = strlen(pMethod) + strlen(pRequest)+ strlen(szVersion)+ strlen(pPack) + 12;     char *pRet = NULL;    pRet = new char[iLen];#if defined(_MSC_VER) && (_MSC_VER >= 1400 )    sprintf_s(pRet, iLen * sizeof(char), "%s %s HTTP/%s
    %s
    \0", pMethod, pRequest, szVersion, pPack);#else    sprintf(pRet, "%s %s HTTP/%s
    %s
    \0", pMethod, pRequest, szVersion, pPack);#endif    delete [] pPack;    pPack = pRet;    return iLen - 1;}void    HTTPS::RequestField(char*& pPack,const char* pKey,const char* pValue) const{    char *pPos = NULL;    unsigned int iOldLen = 0;    if (pValue)    {        if (pPack)            iOldLen = strlen(pPack);        pPack = (char*)realloc(pPack,iOldLen + strlen(pKey) + strlen(pValue) + 3);        pPos = pPack + iOldLen;         while(*pKey)            *(pPos++) = *(pKey++);         while(*pValue)            *(pPos++) = *(pValue++);         *(pPos++) = '
    ';        *(pPos++) = '
    ';        *(pPos  ) = '\0';    }}char*   HTTPS::RequestField(const char* pPos,const char* pKey) const{    char *pBegin = NULL;    char *pEnd = NULL;    char *pKeyCopy = NULL;    char *pRet = NULL;    int iLen = 0;     if (pKey != NULL)    {        iLen = strlen(pKey);         pKeyCopy = new char [iLen + 2];        memcpy(pKeyCopy, pKey, iLen * sizeof(char));        pKeyCopy[iLen    ] = ':';        pKeyCopy[iLen + 1] = '\0';        if ((pBegin = strstr((char*)pPos,pKeyCopy))!=NULL)        {            pBegin += strlen(pKeyCopy);              while((*pBegin == ' ') && (*(pBegin + 1) != '\0'))                pBegin++;            if ((pEnd = strchr(pBegin,'
    ')) != NULL)            {                iLen = pEnd - pBegin;                if (iLen > 0)                {                    pRet = new char[iLen + 1];                    memcpy(pRet, pBegin, iLen * sizeof(char));                    pRet[iLen] = '\0';                }            }        }        delete [] pKeyCopy;        pKeyCopy = NULL;    }    return pRet;}int     HTTPS::Open(){    SSL_CTX *ctx = NULL;    int iRet=0;     iSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // Khởi tạo Socket    if(iSocket != INVALID_SOCKET)    {        HOSTENT *hostInfo = gethostbyname(szHost); // Nhờ DNS phân giải địa chỉ.        if(hostInfo != NULL)        {            SOCKADDR_IN SockAddr;            SockAddr.sin_port = htons(iPort);            SockAddr.sin_family = AF_INET;            SockAddr.sin_addr.s_addr = (*(DWORD*)hostInfo->h_addr_list[0]);            iRet = connect(iSocket,(SOCKADDR*)(&SockAddr), sizeof(SockAddr)); // Kết nối tới host.            if (iRet == SOCKET_ERROR)            {                //Lỗi...                wprintf(L"=CRITICAL= | connect() failed with error code %d, WSAGetLastError = %d
    ", iRet, WSAGetLastError());            }            if (iRet == 0)            {                if (bUseSSL)                {                    SSL_library_init();                    ctx = SSL_CTX_new(SSLv23_client_method());                    ssl = SSL_new(ctx);                    SSL_CTX_free(ctx);                    SSL_set_fd(ssl,iSocket);                    iRet = SSL_get_error(ssl,SSL_connect(ssl));                    if (iRet == SSL_ERROR_SSL)                        return 0;                }                bConnected = true;                return iSocket;            }        }    }    else    {        //Lỗi...        wprintf(L"=CRITICAL= | socket() failed with error code %d, WSAGetLastError = %d
    ", iRet, WSAGetLastError());    }    return 0;}char*   HTTPS::Host() const{       unsigned int iLen = 0;    char *pRet = NULL;    if (szHost!=NULL)    {        iLen = strlen(szHost);        pRet = new char[iLen + 1];        memcpy(pRet, szHost, iLen * sizeof(char));        pRet[iLen] = '\0';    }    return pRet;}bool    HTTPS::Host(const char* pHost){    unsigned int iLen = 0;    if (pHost != NULL)    {        delete [] szHost;        szHost = NULL;            iLen = strlen(pHost);        szHost = new char[iLen + 1];        memcpy(szHost, pHost, iLen * sizeof(char));        szHost[iLen] = '\0';        return true;    }    return false;}char*   HTTPS::Header() const{    unsigned int iLen = 0;    char *pRet = NULL;    if (szHeader != NULL)    {        iLen = strlen(szHeader);        pRet = new char[iLen + 1];        memcpy(pRet, szHeader, iLen * sizeof(char));        pRet[iLen] = '\0';    }    return pRet;}char*   HTTPS::HeaderField(const char* pFieldName,int& iPos) const{    char *pPos = NULL;    char *pValue = NULL;    if (pFieldName != NULL)    {        pPos = szHeader + iPos;        pValue = RequestField(pPos, pFieldName);        if (pValue != NULL)        {            pPos = strstr(pPos, pFieldName) + strlen(pFieldName) + strlen(pValue) + 1;            iPos = pPos - szHeader;            return pValue;        }    }    return NULL; }bool    HTTPS::Body(const char* pBody,long lLength){    if (pBody != NULL)    {        delete [] szBody;        szBody = new char[lLength + 1];        memcpy(szBody, pBody, lLength * sizeof(char));        szBody[lLength] = '\0';        return true;    }    return false;}char*   HTTPS::Body(long& lLength) const{    char *pRet = NULL;    lLength = 0;    if (szBody != NULL)    {        pRet = new char[lBodyLength + 1];        memcpy(pRet, szBody, lBodyLength * sizeof(char));        pRet[lBodyLength] = '\0';        lLength = lBodyLength;        return pRet;    }    return NULL;}bool    HTTPS::Version(const char* pVersion){    if (pVersion != NULL)    {        delete [] szVersion;        int iLen = strlen(pVersion);        szVersion = new char[iLen + 1];        memcpy(szVersion, pVersion, iLen * sizeof(char));        szVersion[iLen] = '\0';        return true;    }    return false;}char*   HTTPS::Version() const{    char *pRet = NULL;    if (szVersion != NULL)    {        int iLen = strlen(szVersion);        pRet = new char[iLen + 1];        memcpy(pRet, szVersion, iLen * sizeof(char));        pRet[iLen] = '\0';        return pRet;    }    return NULL;}bool    HTTPS::UserAgent(const char *pUserAgent){    if (pUserAgent)    {        delete [] szUserAgent;        int iLen = strlen(pUserAgent);        szUserAgent = new char[iLen + 1];        memcpy(szUserAgent, pUserAgent, iLen * sizeof(char));        szUserAgent[iLen] = '\0';        return true;    }    return false;}char*   HTTPS::UserAgent() const{    char *pRet = NULL;    if (szUserAgent != NULL)    {        int iLen = strlen(szUserAgent);        pRet = new char[iLen + 1];        memcpy(pRet,szUserAgent, iLen * sizeof(char));        pRet[iLen] = '\0';        return pRet;    }    return NULL;}bool    HTTPS::Accept(const char* pAccept){    if (pAccept != NULL)    {        delete [] szAccept;        int iLen = strlen(pAccept);        szAccept = new char[iLen + 1];        memcpy(szAccept, pAccept, iLen * sizeof(char));        szAccept[iLen] = '\0';        return true;    }    return false;}char*   HTTPS::Accept() const{    if (szAccept != NULL)    {        char *pRet = NULL;        int iLen = strlen(szAccept);        pRet = new char[iLen + 1];        memcpy(pRet,szAccept, iLen * sizeof(char));        pRet[iLen] = '\0';        return pRet;    }    return NULL;}bool    HTTPS::AcceptLanguage(const char* pAcceptLanguage){    if (pAcceptLanguage)    {        delete [] szAcceptLanguage;        int iLen = strlen(pAcceptLanguage);        szAcceptLanguage = new char[iLen + 1];        memcpy(szAcceptLanguage, pAcceptLanguage, iLen * sizeof(char));        szAcceptLanguage[iLen] = '\0';        return true;    }    return false;}char*   HTTPS::AcceptLanguage() const{    if (szAcceptLanguage!=NULL)    {        char *pRet = NULL;        int iLen = strlen(szAcceptLanguage);        pRet = new char[iLen + 1];        memcpy(pRet,szAcceptLanguage, iLen * sizeof(char));        pRet[iLen] = '\0';        return pRet;    }    return NULL;}bool    HTTPS::AcceptCharset(const char* pAcceptCharset){    if (pAcceptCharset)    {        delete [] szAcceptCharset;        int iLen = strlen(pAcceptCharset);        szAcceptCharset = new char[iLen + 1];        memcpy(szAcceptCharset, pAcceptCharset, iLen * sizeof(char));        szAcceptCharset[iLen] = '\0';        return true;    }    return false;}char*   HTTPS::AcceptCharset() const{     if (szAcceptCharset!=NULL)    {        char *pRet = NULL;        int iLen = strlen(szAcceptCharset);        pRet = new char[iLen + 1];        memcpy(pRet,szAcceptCharset, iLen * sizeof(char));        pRet[iLen] = '\0';        return pRet;    }    return NULL;}bool    HTTPS::Cookie(const char* pKey,const char* pValue){    if ((pKey != NULL) && (pValue != NULL))    {        unsigned int iLen = 0;        char *pPos = NULL;        char *pTMP = NULL;         iLen = strlen(pKey) + strlen(pValue) + 3; // Thêm một ký tự '=', một ký tự ';' và một ký tự ' '        if (szCookie == NULL)        {            pTMP = new char[iLen + 1];              pPos = pTMP;        }        else        {            iLen += strlen(szCookie);            pTMP = new char[iLen + 1];            pPos = pTMP;            memcpy(pPos, szCookie, strlen(szCookie) * sizeof(char));                pPos += strlen(szCookie);            delete [] szCookie;// Giải phóng bộ nhớ đã cấp phát.        }        memcpy(pPos, pKey, strlen(pKey) * sizeof(char));        pPos+=strlen(pKey);        *(pPos++) = '=';        memcpy(pPos, pValue, strlen(pValue) * sizeof(char));    pPos+=strlen(pValue);        memcpy(pPos, "; ", 2 * sizeof(char));        pTMP[iLen] = '\0';        szCookie = pTMP;        return true;    }    return false;}char*   HTTPS::Cookie(const char* pKey) const{    if ((pKey != NULL) && (szCookie != NULL))    {        char *pKeyCopy = NULL;        char *pRet = NULL;        char *beginPos = NULL;        char *endPos = NULL;        unsigned int iLen = 0;         iLen = strlen(pKey);// Lấy chiều dài khóa.        pKeyCopy = new char[iLen + 2];        memcpy(pKeyCopy, pKey, iLen * sizeof(char));        pKeyCopy[iLen    ] = '=';        pKeyCopy[iLen + 1] = '\0';        if (beginPos = strstr(szCookie, pKeyCopy)) // Kiểm tra xem có khóa Cookie cần tìm không.        {            beginPos += strlen(pKeyCopy);// Di chuyển đến vị trí bắt đầu của giá trị.            endPos = strchr(beginPos, ';');// Vị trí kết thúc Cookie.            iLen = endPos - beginPos;// Lấy chiều dài của giá trị.            if (iLen > 0)            {                pRet = new char[iLen + 1];                memcpy(pRet, beginPos, iLen * sizeof(char));                pRet[iLen] = '\0';                return pRet;            }        }        delete [] pKeyCopy;    }    return NULL;}bool    HTTPS::Request(const char* szMethod,const char* szRequest,bool bAttachBody,bool bAttachFromFile,bool bResponseToFile){    if ((bConnected) && (szMethod != NULL))    {        int iLen = 0;        int iRet = 0;        long lFileLength = 0;        char *pTMP = NULL;         RequestField(pTMP, "Host: ", szHost);        RequestField(pTMP, "User-Agent: ", szUserAgent);        RequestField(pTMP, "Accept: ", szAccept);        RequestField(pTMP, "Accept-Charset: ",szAcceptCharset);        RequestField(pTMP, "Accept-Language: ", szAcceptLanguage);        RequestField(pTMP, "Connection: ", bKeepAlive?"Keep-Alive":"Close");        RequestField(pTMP, "Cookie: ", szCookie);        if (bAttachBody)        {            char *pTMP3 = NULL;            long lLength = 0;            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.            memset(pTMP3, 0, 12 * sizeof(char));            if (bAttachFromFile)            {                if (fileAttach != NULL)                {                    fseek(fileAttach, 0, SEEK_END);                    lFileLength = ftell(fileAttach);                    fseek(fileAttach, 0, SEEK_SET);                    lLength = lFileLength;                }            }            else            {                if (szBody != NULL)                    lLength = lBodyLength;            }#if defined(_MSC_VER) && (_MSC_VER >= 1400 )            _itoa_s(lLength, pTMP3, 11 * sizeof(char), 10);#else            _itoa(lLength, pTMP3, 10);#endif            RequestField(pTMP, "Content-Length: ", pTMP3);            RequestField(pTMP, "Content-Type: ", "application/x-www-form-urlencoded");            delete [] pTMP3;        }        iLen = CreateRequest(pTMP, szMethod, szRequest);        if (bUseSSL)            iRet = SSL_write(ssl, pTMP, iLen);        else            iRet = send(iSocket, pTMP, iLen, 0);         delete [] pTMP;        pTMP = NULL;         if (iLen == iRet)        {            if (bAttachBody)            {                char *pPos = NULL;                int iLen = 0;                long lSize = 0;                if (bAttachFromFile)                {                    lSize = lFileLength;                    pPos = new char[BUFFSIZE];                    fread(pPos, MIN(BUFFSIZE, lSize) * sizeof(char), 1, fileAttach);                }                else                {                    lSize = lBodyLength;                    pPos = szBody;                }                while (lSize > 0)                {                    iLen = MIN(BUFFSIZE, lSize);                    if (bUseSSL)                        iRet = SSL_write(ssl, pPos, iLen);                    else                        iRet = send(iSocket, pPos, iLen, 0);                    if (iLen != iRet)                        return false;                        lSize -= iLen;                    if (bAttachFromFile)                        fread(pPos, MIN(BUFFSIZE, lSize) * sizeof(char), 1, fileAttach);                    else                        pPos += iLen;                }                if (bAttachFromFile)                    delete [] pPos;            }            if (receivelData(bResponseToFile) && getstatusCode() && processCookie())                 return true;        }    }    return false;}bool    HTTPS::processCookie(){    if (szHeader != NULL)// Không thể lấy Cookie khi phần Header trống.    {        char *pPos = NULL;        char *pPos1 = NULL;        char *pPos2 = NULL;        char *pTMP = NULL;        char *pBegin = NULL;        char *pEnd = NULL;        char *pValue = NULL;         unsigned int iLen = 0;        unsigned int iOldLen = 0;         delete [] szCookie;        pPos = szHeader;        while((pValue = RequestField(pPos, "Set-Cookie")) != NULL)        {            iLen = strcspn(pValue, ";");            if (pTMP != NULL)                iOldLen = strlen(pTMP);            pTMP = (char*)realloc(pTMP,iOldLen + iLen + 3);                        memcpy(pTMP + iOldLen, pValue, iLen * sizeof(char));            pTMP[iLen + iOldLen    ] = ';';            pTMP[iLen + iOldLen + 1] = ' ';            pTMP[iLen + iOldLen + 2] = '\0';             pPos = strstr(pPos, "Set-Cookie") + strlen(pValue) + 12;             delete [] pValue;            pValue = NULL;        }        if (pTMP != NULL)        {            iLen = strlen(pTMP);             szCookie = new char[iLen + 1];            memcpy(szCookie, pTMP, iLen * sizeof(char));            szCookie[iLen] = '\0';             delete [] pTMP;            pTMP = NULL;        }        return true;    }    return false;}bool    HTTPS::receivelData(bool bFile){    int iRet = 0;    fd_set fdread;    timeval timeout;    /* Thời gian chờ server trả lời. */    timeout.tv_sec = lTimeOut / 1000;    timeout.tv_usec = lTimeOut % 1000;     /* Xóa rỗng tập trước khi gọi select() */    FD_ZERO(&fdread);     /* Đặt Socket vào tập hợp. */    FD_SET(iSocket, &fdread);    if ((iRet = select(0, &fdread, NULL, NULL, &timeout)) == SOCKET_ERROR)    {        //Lỗi...        wprintf(L"=CRITICAL= | select() failed with error code %d, WSAGetLastError = %d
    ", iRet, WSAGetLastError());    }    if (iRet > 0)    {        if (FD_ISSET(iSocket,&fdread))        {            char *pTMP = NULL;                        /* Nhận phần Header */             bool bDone = false;            bool bEndHeader = false;            char HeaderResponse;            unsigned int iLen = 0;            long bytesRead = 0;            while(!bDone)            {                if (bUseSSL)                    bytesRead = SSL_read(ssl, &HeaderResponse, 1);                else                    bytesRead = recv(iSocket, &HeaderResponse, 1, 0);                                if(bytesRead <= 0)                    bDone = true;                switch(HeaderResponse)                {                    case '
    ':                        break;                    case '
    ': // Nếu gặp "
    
    " hay "
    
    " thì kết thúc Header                        if (bEndHeader)                            bDone = true;                        bEndHeader = true;                        break;                    default:                        bEndHeader = false;                        break;                }                pTMP = (char*)realloc(pTMP, iLen + 2);                *(pTMP + iLen++ ) = HeaderResponse;                *(pTMP + iLen   ) = '\0';            }            delete [] szHeader;            szHeader = new char[iLen + 1];            memcpy(szHeader, pTMP, iLen * sizeof(char));            szHeader[iLen] = '\0';            delete [] pTMP;            pTMP = NULL;             /* Nhận phần Body. */             char *pBodyResponse = new char[BUFFSIZE];;            bool bChunked = false;            bool bExit = false;            long BuffSize = 0;             ChunkState stt;            stt.Chunk = false;            stt.ChunkLength = 0;                         /* Nếu con trỏ tập tin bằng NULL thì không ghi vào tập tin. */            if (fileResponse == NULL)                bFile = false;            /* Đưa con trỏ về đâu tập tin */            if (bFile)                fseek(fileResponse, 0, SEEK_SET);                        pTMP = RequestField(szHeader,"Transfer-Encoding");            if (pTMP != NULL)            {                bChunked = (strcmp(pTMP,"chunked") == 0);                delete[] pTMP;                pTMP = NULL;            }             do             {                /* Xóa rỗng tập trước khi gọi select() */                FD_ZERO(&fdread);                 /* Đặt Socket vào tập hợp. */                FD_SET(iSocket, &fdread);                if ((iRet = select(0, &fdread, NULL, NULL, &timeout)) == SOCKET_ERROR)                {                    //Lỗi...                    wprintf(L"=CRITICAL= | select() failed with error code %d, WSAGetLastError = %d
    ", iRet, WSAGetLastError());                    break;                }                if (iRet > 0)                    if (FD_ISSET(iSocket, &fdread))                    {                        /* Xóa sạch dữ liệu trước khi nhận dữ liệu mới. */                        memset(pBodyResponse, 0, BUFFSIZE);                        if (bUseSSL)                            /* Đọc BUFFSIZE Bytes. */                             bytesRead = SSL_read(ssl, pBodyResponse, BUFFSIZE);                        else                            /* Đọc BUFFSIZE Bytes. */                            bytesRead = recv(iSocket, pBodyResponse, BUFFSIZE, 0);                        /* Không đọc được dữ liệu hoặc kết nối bị lỗi thì thoát. */                        if (bytesRead <= 0)                            break;                         /* Giải mã Chunk lúc run-time. */                        if (bChunked)                            DecodeChunked(&stt, pBodyResponse, bytesRead, bExit);                         if (bFile)                            /* Ghi dữ liệu vào tập tin. */                            fwrite(pBodyResponse, bytesRead * sizeof(char), 1, fileResponse);                        else                        {                            /* Chép dữ liệu vừa nhận được vào vùng nhớ tạm. */                            pTMP = (char*)realloc(pTMP, BuffSize + bytesRead + 1);                            memcpy(pTMP + BuffSize, pBodyResponse, bytesRead * sizeof(char));                            pTMP[BuffSize + bytesRead] = '\0';                            BuffSize += bytesRead;                        }                    }                    else                        break;            }            while ((iRet > 0) && !bExit);             delete [] pBodyResponse;            delete [] szBody;             szBody = NULL;            lBodyLength = 0;            /* Nếu ghi vào tập tin hoặc không nhận được phần Body               thì vùng nhớ tạm sẽ không được cấp phát.            */            if (pTMP != NULL)            {                szBody = new char[BuffSize + 1];                memcpy(szBody, pTMP, BuffSize * sizeof(char));                szBody[BuffSize] = '\0';                lBodyLength = BuffSize;                delete [] pTMP;            }            return true;        }    }    return false;}bool    HTTPS::getstatusCode(){    iStatusCode = 0;    if (szHeader != NULL)    {        char *pPos = NULL;        pPos = szHeader;        while((*(pPos++) != ' ') && (*pPos != '\0'));        iStatusCode = atoi(pPos);        return true;    }    return false;}void    HTTPS::Clear(){    iStatusCode = 0;    lBodyLength = 0;     delete [] szHeader;    szHeader = NULL;     delete [] szBody;    szBody = NULL;}void    HTTPS::Default(){    delete [] szAccept;    szAccept = NULL;     delete [] szAcceptCharset;    szAcceptCharset = NULL;     delete [] szAcceptLanguage;    szAcceptLanguage = NULL;     delete [] szUserAgent;    szUserAgent = NULL;     delete [] szVersion;    szVersion = NULL;     lTimeOut = 10000;    szAccept = _strdup(HTTP_Accept);    szAcceptCharset = _strdup(HTTP_AcceptCharset);    szAcceptLanguage = _strdup(HTTP_AcceptLanguage);    szUserAgent = _strdup(HTTP_UserAgent);    szVersion = _strdup(HTTP_Version);}void    HTTPS::Reset(){    delete [] szHost;    szHost = NULL;     delete [] szHeader;    szHeader = NULL;     delete [] szBody;    szBody = NULL;     delete [] szCookie;    szCookie = NULL;     iStatusCode = 0;    lBodyLength = 0;     bKeepAlive = false;    bUseSSL = false;    bConnected = false;     if (bUseSSL)    {        SSL_free(ssl); // Nếu có kết nối SSL thì đóng.        ssl = NULL;    }    if(iSocket != 0)    {        shutdown(iSocket,SD_BOTH);  // Đóng kết nối        closesocket(iSocket);       // Hủy Socket    }}void    HTTPS::Close(bool bClearAll){    if (bClearAll)    {        delete [] szAccept;        szAccept = NULL;         delete [] szAcceptCharset;        szAcceptCharset = NULL;         delete [] szAcceptLanguage;        szAcceptLanguage = NULL;         delete [] szUserAgent;        szUserAgent = NULL;         delete [] szVersion;        szVersion = NULL;          lTimeOut = 10000;        szAccept = _strdup(HTTP_Accept);        szAcceptCharset = _strdup(HTTP_AcceptCharset);        szAcceptLanguage = _strdup(HTTP_AcceptLanguage);        szUserAgent = _strdup(HTTP_UserAgent);        szVersion = _strdup(HTTP_Version);         iStatusCode = 0;        lBodyLength = 0;         delete [] szHost;        szHost = NULL;         delete [] szHeader;        szHeader = NULL;         delete [] szBody;        szBody = NULL;         delete [] szCookie;        szCookie = NULL;         bKeepAlive = false;        bUseSSL = false;    }    if (bUseSSL)    {        SSL_free(ssl);          // Nếu có kết nối SSL thì đóng.        ssl = NULL;    }    if(iSocket != 0)    {        shutdown(iSocket, SD_BOTH); // Đóng kết nối        closesocket(iSocket);       // Hủy Socket    }    bConnected = false;}void HTTPS::DecodeChunked(PChunkState state, char *data, long &length, bool &bExit) const{    long inLength = 0;    long outLength = 0;     char *out = NULL;    char *posOut = NULL;    char *posIn = NULL;    posIn = data;    inLength = length;    out = new char[inLength];    posOut = out;    do    {        if (state->Chunk == false)        {            char *CRLF = NULL;            char *pLength = NULL;            char *error = NULL;            CRLF = strstr(posIn,"
    ");            if (CRLF != NULL)            {                int iLen = CRLF - posIn;                pLength = new char[iLen + 1];                memcpy(pLength, posIn,iLen * sizeof(char));                pLength[iLen] = '\0';                 state->ChunkLength = strtol(pLength, &error, 16);                state->Chunk = (state->ChunkLength != 0); /* Phần tiếp theo là dữ liệu. */                posIn = CRLF + 2; /* Di chuyển qua kích thước của Chunk. */                inLength -= (iLen + 2);                bExit = (state->ChunkLength == 0);            }            else                break;        }        else        {            if (state->ChunkLength == 0)                break;            /* 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*/            if (state->ChunkLength >= inLength)            {                memcpy(posOut, posIn, inLength * sizeof(char));                state->ChunkLength -= inLength;                 posOut += inLength;                outLength += inLength;                 /*  Đã lấy hết Chunk. */                if (state->ChunkLength == 0)                    state->Chunk = false;                inLength = 0;            }            else            {                memcpy(posOut, posIn, state->ChunkLength * sizeof(char));                inLength -= state->ChunkLength;                posIn += state->ChunkLength;                posOut += state->ChunkLength;                outLength += state->ChunkLength;                 state->Chunk = false;                state->ChunkLength = 0;            }        }    }    while(inLength >0);     memset(data, 0, length * sizeof(char));    memcpy(data, out, outLength * sizeof(char));    length = outLength;    delete[] out;}

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi meoconlongvang
    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ử !

    Mã:
     int gui =    send( ConnectSocket, relink, (int)strlen(relink), 0 ); // check cuoi cung                                                                            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 )
    :
    Mã:
            // ==========================Het phan su kien connect =======================         if(NetworkEvents.lNetworkEvents & FD_WRITE)        {            if(NetworkEvents.iErrorCode[FD_WRITE_BIT] == 0)            {                cout<<" Dang gui Request toi sever .....
    ";                // nhan du lieu ......                                                                            size_t by_nhan;                                        do{                                                                             by_nhan = recv(ConnectSocket, recvbuf, sizeof(recvbuf)-1, 0);                                                                                if(by_nhan<0){                                                                                    break;                                        }                                        recvbuf[by_nhan]=0;                                        //cout<<recvbuf;                                                                                     }                                        while(by_nhan>0);             }            else{                cout<<"Loi su kien gui ......"<<WSAGetLastError()<<endl;            }        }         //esle{cout<<"Chua "<<endl;}        //===========================Het su kien gui ....============================
    kết quả em run thử vẫn không thông báo sự kiện FD_READ ạ !

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    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ả.

  6. #6
    Trích dẫn Gửi bởi meoconlongvang
    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 !

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •