socket的recv非常慢,为什么?

//获取用户信息
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\n"
                                "Host: 127.0.0.1\n"
                                "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\n"
                                "Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3\n"
                                "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0\n\n\n";
        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))//需要等2秒左右,才能进入if语句内部,也就是说此时缓冲区中才有从服务端返回的数据
                {
                        ZeroMemory(buffer,sizeof(buffer));
                        retval = recv(this->m_ManagerSock ,(char*)buffer,sizeof(buffer),0);        
                        strResult += buffer;
                }
        }
解决办法:

默认情况下,请求消息头中的,Connection默认为keep-alive
所以只需要再构造请求头中再添加上一句:
"Connection: close\r\n"
就可以了。
另外,也可以通过apache的配置文件,将keepalive设置为off(不建议)

版权所有,迎转载,但转载请注明: 转载自  曾是土木人

你可能感兴趣的:(socket的recv非常慢,为什么?)