zoukankan      html  css  js  c++  java
  • Windows下C语言实现HTTP客户端

      1 #include "stdafx.h" //控制台应用自带头文件,能够加快编译的速度
     2 #include<winsock2.h> //通过该头文件调用winsock的函数,如下文的WSAStartup、bind()、connect()、inet_addr()等
     3 #include<windows.h>   //调用windows内核及接口函数
     4 #include<stdio.h>
     5 #include<stdlib.h>
     6 #include<assert.h>
     7 #pragma comment(lib,"ws2_32")  //说明需要使用win32的库
     8 
     9 int main(int argc, char* argv[]) {
    10     int i;        
    11     SOCKET fd;           //套接字初始化
    12     SOCKADDR_IN addr;  //该结构体初始化可以让我们对 “协议簇类型、网络地址、端口号”进行操作
    13     WSADATA wsadata;
    14 
    15     i = WSAStartup(0x0202, &wsadata); //说明Win32库的版本及对象
    16     fd = socket(PF_INET, SOCK_STREAM, 0); //协议类型、地址、端口号的初始化
    17     addr.sin_addr.S_un.S_addr = 0;
    18     addr.sin_family = AF_INET;
    19     addr.sin_port = 0;
    20 
    21     i = bind(fd, (sockaddr*)&addr, sizeof(SOCKADDR_IN)); //将上文的套接字进行绑定
    22 
    23     addr.sin_addr.S_un.S_addr = inet_addr("202.119.224.201"); //确定IP地址和端口号
    24     addr.sin_port = ntohs(80);
    25 
    26     i = connect(fd, (sockaddr*)&addr, sizeof(SOCKADDR_IN));   //尝试进行TCP三次握手
    27     if (i == NOERROR) {
    28         char *Buffer = new char[8193];
    29         i = sprintf(Buffer, "GET / HTTP/1.1
    "     //HTTP协议的语法格式
    30             "Host:www.njupt.edu.cn
    "
    31             "User-Agent:whatever
    "
    32             "Accept-Type:*/*
    "
    33             "Connection:close
    "
    34             "X-Power:XXX
    
    ");          //注意这里要空一行,因为HTTP头与体之间需要空一行进行区分
                                    //否则对方服务器无法识别,请求无法通过
    35 int n = send(fd, Buffer, i, 0);      //发送请求数据 36 if (n == i) { 37 do { 38 i = recv(fd, Buffer, 8192, 0);  //接收服务器响应 39 if (i <= 0) { 40 printf("closed by peer:%d ", i); 41 break; 42 } 43 Buffer[i] = ''; 44 printf("%s ", Buffer);    //循环输出网页数据 45 } while ("Go!"); 46 47 } 48 else              //两个else是错误情况的反馈 49 { 50 printf("we can't send to... "); 51 } 52 delete[]Buffer; //数组使用完成,释放掉数组空间 53 } 54 else 55 { 56 printf("we can't connect to.. "); 57 } 58 i = closesocket(fd);      //请求完成,关闭套接字,清除WSA 59 i = WSACleanup(); 60 system("pause"); 61 return 0; 62 }

    需要明确两个概念:

      网络字节:指的是网络字节顺序,它是TCP/IP协议中规定的字节顺序,通常采用大端排序
      主机字节:主机中内存地址顺序。排序方式与CPU 操作系统有关。
     
    结构体说明:
      SOCK_STREAM,流套接字用于提供可靠有连接的数据传输服务,能够保证无差错、有顺序、无重复接收,使用TCP协议。
      SOCKET,套接字结构体
      SOCKADDR_IN, 看一看它的结构相信就能够有所理解了
                  struct SOCKADDR_IN{
                        short int sin_family; //通信协议类型族
                        unsigned short int sin_port; //端口号
                        struct in_addr sin_addr; //IP地址
                        unsigned char si_zero[8];  //填充0以保持与sockaddr结构的长度相同,这个暂时用不着
                       }
     

    代码中所说的HTTP结构需要空一行的原因用两个个图说明:

               

    争取下周把服务器的代码也放出来

  • 相关阅读:
    sell02 展现层编写
    sell01 环境搭建、编写持久层并进行测试
    SpringBoot04 日志框架之Logback
    SpringBoot04 项目热部署详解
    SpringBoot03 项目热部署
    Angular14 利用Angular2实现文件上传的前端、利用springBoot实现文件上传的后台、跨域问题
    Flask17 Flask_Script插件的使用
    Angular13 Angular2发送PUT请求在后台接收不到参数
    PostMan安装
    unix网络编程环境配置程序运行
  • 原文地址:https://www.cnblogs.com/hhjfighting/p/8760086.html
Copyright © 2011-2022 走看看