zoukankan      html  css  js  c++  java
  • WINSocket编程 发生HTTP GET请求,并接收服务器返回

    首先要添加引用

    #include "winsock2.h" //header
    #pragma comment (lib, "ws2_32.lib") //lib

    调用的代码:

    BOOL HttpClient(std::string& rest) //用参数接收返回的字符数据

        std::
    string errMsg;//错误信息记录
        WSADATA wsaData;
        SOCKET sock;
        SOCKADDR_IN tcpaddr;
        hostent 
    * remoteHost;
        
    char   host[] = {"192.168.1.1"};     //主机名就直接写了 
        int   Ret,l;
        BOOL done;
        
    int   port = 80;
        
    int   chars = 0;
        
    char buffer[1024];

        
    if( (Ret = WSAStartup(MAKEWORD(1,1), &wsaData) ) != 0 )
        {
            errMsg
    +="WSAStartup failed with error "+Ret;
            
    return 1;
        }

        
    if( (remoteHost = gethostbyname(host)) == NULL )       //通过主机名获取地址
        {
            errMsg
    +="gethostbyname error!\n";
            
    return 1;
        }

        sock 
    = socket (AF_INET, SOCK_STREAM, 0);

        tcpaddr.sin_family 
    = AF_INET;
        tcpaddr.sin_port 
    = htons( (unsigned short)port );
        tcpaddr.sin_addr.s_addr 
    = *((unsigned long *)*remoteHost->h_addr_list); //转换地址

        
    if( connect(sock, (const sockaddr * )&tcpaddr, sizeof(tcpaddr)) )
        {
            errMsg
    +="connect error!";
            
    return 1;
        }
        
    //这里是要发送的http头部
        SendString(sock,"GET / HTTP/1.1\r\n");
        SendString(sock,
    "Host:192.168.1.1\r\n");
        SendString(sock,
    "Accept: */*\r\n");
        SendString(sock,
    "User-Agent: Mozilla/4.0");
        SendString(sock,
    "(compatible; MSIE 7.00; Windows 98)\r\n");
        SendString(sock,
    "Connection:Keep-Alive\r\n");
        SendString(sock,
    "\r\n");
        SendString(sock,
    "\r\n");//最后要加空行

        done 
    = FALSE;
        
    //FILE * fp;
        
    //fp = fopen("1.txt","w");
        
    //打印并保存http响应的头部
        std::string str;
        
    while(!done)
        {
            l 
    = recv(sock,buffer,1,0);//一个字节一个字节的接受HTTP头
            str+=*buffer;
            
    if(l<0)
                done
    =TRUE;
            
    switch(*buffer)
            {
            
    case '\r':
                
    break;
            
    case '\n'://判断HTTP头是否接受完毕
                if(chars==0)
                    done 
    = TRUE;
                chars
    =0;
                
    break;
            
    default:
                chars
    ++;
                
    break;
            }
            printf(
    "%c",str);
            
    //fputc(buffer[0],fp);
        }

        
    //接收正文部分
        int sum = 0;
        
    do
        {
            l 
    = recv(sock,buffer,1024,0);
            
    if( l < 0 )
                
    break;
            sum 
    += l;
            
            str.append(buffer,l);
            
            
    //*(buffer + l) = 0;
            
    //fputs(buffer,fp);
            
        } 
    while( l > 0 );

        
    //这里输出正文部分大小,发现其实和响应消息头部的Content-length大小是一样的
        
    //这样就可以检查是否接受完毕
        printf("sum = %d\n",sum);

        closesocket(sock);

        
    if( WSACleanup() == SOCKET_ERROR )
        {
            errMsg
    +="WSACleanup failed with error "+WSAGetLastError();
        }
        rest
    =str;

        
    return 1;
    }

    void SendString(SOCKET sock,LPCSTR str)
    {
        send(sock,str,strlen(str),
    0);
    }
  • 相关阅读:
    383. Ransom Note
    598. Range Addition II
    453. Minimum Moves to Equal Array Elements
    492. Construct the Rectangle
    171. Excel Sheet Column Number
    697. Degree of an Array
    665. Nondecreasing Array
    视频网站使用H265编码能提高视频清晰度吗?
    现阶段的语音视频通话SDK需要解决哪些问题?
    企业远程高清会议平台视频会议系统在手机端使用的必备要求有哪些?
  • 原文地址:https://www.cnblogs.com/format/p/1750860.html
Copyright © 2011-2022 走看看