美文网首页
soket进行http访问

soket进行http访问

作者: child_cool | 来源:发表于2018-08-01 22:57 被阅读38次

    1.建立到服务器的TCP连接

    • HTTP基本TCP,所以我们需要与服务器建立连接,然后才能发送数据
    /*
    *打开Socket,返回socketId,-1表示失败
    */
    int socket_open(int IP,int Port,int type){
    SOCKET socketId;
     struct sockaddr_in serv_addr;
      int status;
     
     socketId=socket(AF_INET,SOCK_STREAM,0);
     
     if((int)socketId<0)
     {
           printf("[ERROR]Create a socket failed!/n");
           return -1;
     }
     
     memset(&serv_addr,0,sizeof(serv_addr));
     serv_addr.sin_family=AF_INET;
     serv_addr.sin_addr.s_addr = ntohl(IP);
     serv_addr.sin_port = htons((USHORT)Port);
     status=connect(socketId,(struct sockaddr*)&serv_addr,sizeof(serv_addr));
        if(status!=0)
     {
        printf("[ERROR]Connecting failed!/n");
        closesocket(socketId);
        return -1;
     }
     return socketId;
    }
    
    /// 开始建立链接,0xC0A80001是192.168.0.1的十六进制写法
    int socketId=socket_open(0xC0A80001,808,0); 
    

    2.向服务器发送GET或者POST报文

    • 根据HTTP协议添加协议头,如下使用GET来获取指定URL的指定文档
    static const char* protocolHead="GET http://www.xxx.com/index.html HTTP/1.1/n"
         "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*/n"
         "Accept-Language: zh-cn/n"
         "User-Agent:iPanelBrowser/2.0/n"
         "Host: www.xxx.com:80/n"
         "Connection: close/n/n"
    
    • 发送数据
    send(socketId, protocolHead,strlen(protocolHead),0);
    

    3.接受从服务器返回的报文

    • 采用select循环查询的方式来判断有无数据到来
    • 数据包会保存至缓冲区
    struct timeval tm = {0,7};
         fd_set fds_r;
         int status;
         char recvBuf[4096]={‘/0’};
         FD_ZERO(&fds_r);
         FD_SET(socketId,&fds_r);
        
    status=select(socketId+ 1, &fds_r, 0, 0, &tm); //socketId在这里是最大的fd
        
         if(status > 0 && FD_ISSET(socketId, &fds_r))
    {
             printf("Socket is readable...fd=[%d]/n",socketId);
              recv(socketId,recvBuf,4096,0);
    }
    
    • 判断数据接收完成
      • 对返回数据的状态进行判断
        • 仅当状态为“ HTTP 200 OK ”时才表明正确返回,这时才对数据进行解析并保存
        • 如果状态为HTTP 404 NOT FOUND或者其它状态则表明没有找到资源或者出现其它问题
      • 数据正确返回时
        • 对HTTP数据包进行解析得到Content-Length
        • 在包含Content-Length的当前数据包或者随后的数据包中查找第一个空行,这就是内容(Content)的开始位置,配合前面解析得到的Content-Length就可以确定数据是否接收完成

    相关文章

      网友评论

          本文标题:soket进行http访问

          本文链接:https://www.haomeiwen.com/subject/itbvmftx.html