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);
    }
  • 相关阅读:
    在金融服务计算中,必须要使用BigDecimal
    互联网发展的三个阶段
    k3 cloud服务器端安装顺序
    k3 cloud修改数据库密码后无法连接管理中心
    K3 CLOUD提示库存键重复,提示如下
    k3 cloud总账凭证提示冲突,清除冲突并且第二天开机以后依然提示
    k3 cloud注册插件的时候提示,请选择一个有效的插件程序集
    k3 cloud付款单提示余额不足,科目余额表中余额为正,银行存款流水账中未负数
    k3 cloud提示超出产品激活有效期
    k3 cloud在站点中新增用户
  • 原文地址:https://www.cnblogs.com/format/p/1750860.html
Copyright © 2011-2022 走看看