cket의recv는 매우 느려요. 왜요?

2915 단어
// 
CString CMySock::GetMemberInfo(char requestUrl[],char Data[])
{
        char RequestData[1024];
        strcpy(RequestData,Data);
        LPHOSTENT lphost= gethostbyname(requestUrl);
        sockaddr_in server;
        server.sin_family = AF_INET;
        //server.sin_addr.s_addr = ((LPIN_ADDR)lphost->h_addr)->s_addr;
        server.sin_addr.s_addr = inet_addr(requestUrl);
        server.sin_port = htons(this->m_Port);

        if (connect(this->m_ManagerSock, (struct sockaddr *)&server,  sizeof(struct sockaddr)) == SOCKET_ERROR){
                MessageBox(NULL,_T(" , !"),_T(" "),MB_OK|MB_ICONINFORMATION);
                closesocket(this->m_ManagerSock);
                return NULL;
        }
        int retval= send(this->m_ManagerSock,RequestData,sizeof(RequestData)-1,0);

        char buffer[1024]={0};
        CString strResult;
        //char resultBuffer[1024] = "";
        while( SOCKET_ERROR!= retval && retval>0)
        {
                if (SOCKET_Select(this->m_ManagerSock))
                {
                        ZeroMemory(buffer,sizeof(buffer));
                        retval = recv(this->m_ManagerSock ,(char*)buffer,sizeof(buffer),0);        
                        strResult += buffer;
                }
        }
        return strResult;
}

다른 함수에서 호출하기
        char sz[] =        "GET /verfiy.php?type=memberinfo HTTP/1.1
" "Host: 127.0.0.1
" "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
" "Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
" "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0


"; CMySock mySock; char requestUrl[128] = "127.0.0.1"; CString memberInfo = mySock.GetMemberInfo(requestUrl,sz);

질문:
socket의recv를 사용하여 데이터를 받아들일 때 매우 느리고 2초 정도 차이가 나지 않으며 요청한 데이터는 20줄도 안 된다(주: 요청한 것은 로컬에서 만든 php 페이지이기 때문에 속도가 이렇게 느릴 수 없다)
바로:
while( SOCKET_ERROR!= retval && retval>0)
        {
                
if(SOCKET Select(this->m ManagerSock)//if문 내부에 들어가려면 2초 정도 기다려야 합니다. 즉 버퍼에 서버에서 되돌아오는 데이터가 있는 것입니다.
                {
                        ZeroMemory(buffer,sizeof(buffer));
                        retval = recv(this->m_ManagerSock ,(char*)buffer,sizeof(buffer),0);        
                        strResult += buffer;
                }
        }
해결 방법:
기본적으로 요청 메시지 헤더의 연결 기본값은keep-alive이기 때문에 요청 헤더에 "연결: close\r"를 추가하면 됩니다.또한apache의 프로필을 통해keepalive를off로 설정할 수 있습니다 (권장하지 않음)
판권 소유, 전재를 환영하지만, 전재는 일찍이 토목인이었다는 것을 명기해 주십시오.

좋은 웹페이지 즐겨찾기