HTTP和HTTPS简介

http:超文本传输协议,是一个基于请求与响应,无状态的,应用层的协议,常基于TCP/IP协议传输数据,基于TCP之上,是一个标准协议

https:是http的安全版本,而安全是用ssl协议(http+ssl)

具体http协议可以自行查,一般都很详细

我的https协议中ssl层用的是openssl开源库

代码如下

// http.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include <WinSock2.h>
#include <tchar.h>
#include <WS2tcpip.h>
#include <openssl/ssl.h>
#include <regex>
#include <iostream>

#pragma comment(lib, "Ws2_32.lib")

#pragma comment(lib, "libeay32.lib")
#pragma comment(lib, "ssleay32.lib")

void reportError(const char* pre)
{
  LPVOID lpMsgBuf;
  FormatMessage(
    FORMAT_MESSAGE_ALLOCATE_BUFFER |
    FORMAT_MESSAGE_FROM_SYSTEM |
    FORMAT_MESSAGE_IGNORE_INSERTS,
    NULL,
    GetLastError(),
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
    (LPTSTR)&lpMsgBuf,
    0,
    NULL
    );

  printf("%s:%s", pre, lpMsgBuf);


  LocalFree(lpMsgBuf);

}

void showMsg(const TCHAR* msg)
{
  printf("%s\n", msg);
}

int main()
{
  WSADATA wsaData;
  WSAStartup(MAKEWORD(2, 2), &wsaData);

  char buffe2[0x10000];
  FILE *fp = fopen("test.txt", "r");
  fread(buffe2, 1, sizeof(buffe2), fp);
  fclose(fp);
  std::string str = buffe2;
  //正则表达式
  std::regex expression("https://[^\"]*[^\"]");
  std::smatch what;

  std::string::const_iterator start = str.begin();
  std::string::const_iterator end = str.end();
  while (std::regex_search(start, end, what, expression))
  {
    std::cout << what[0] << std::endl;
    start = what[0].second;
  }

 

  int s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  if (s <= 0) 
  {
    reportError("socket");
    return 0;
  }
  showMsg("socket ok");


  //连接
  sockaddr_in addr;
  addr.sin_family = AF_INET;
  addr.sin_port = htons(443); //https:443

  //根据域名获取ip地址
  struct hostent *host = gethostbyname("www.baidu.com");
  addr.sin_addr.S_un.S_addr = *(int*)(host->h_addr_list[0]);

  if (connect(s, (sockaddr*)&addr, sizeof(addr)) < 0) {
    reportError("connect");
    return 0;
  }
  showMsg("connect ok");

  //初始化SSL
  SSL_library_init();

  //创建会话环境(SSL会话环境称为CTX)
  SSL_CTX* sslContext = SSL_CTX_new(SSLv23_client_method());
  if (sslContext == NULL)
  {
      return 0;
  }
   
  //建立SSL套接字
  SSL* sslHandle = SSL_new(sslContext);
  if (sslHandle == NULL)
  {
      return 0;
  }
    
  //申请一个SSL套接字
  SSL_set_fd(sslHandle, s);

  //完成SSL握手
  if (SSL_connect(sslHandle) != 1)
  {
      return 0;
  }
    

  char buffer1[0x1000];
  char buffer2[0x10000] = { 0 };
  int result;

  //https://github.com/openssl/openssl

  //发送协议
  sprintf(buffer1,
    "GET /index.html HTTP/1.1\n"
    "Host:www.51asm.com\n"
    "Accept:text/html, image/png, */*\n" //mime
    "Connection:Keep-Alive\n" //长连接
    "Accept-encoding:gzip\n" //压缩算法
    "Accept-Language:zh\n"   //语言
    "Cache-control:no-cache\n" //缓存控制
    //"Refer:http://www.jszg.edu.cn/portal/home/index.html\n"
    //"User-agent:Mozilla/5.0\n"
    "\n"); //RFC 

  result = SSL_write(sslHandle, buffer1, strlen(buffer1) + 1);
  if (result < 0)
  {
    reportError("send");
  }

  while (result = SSL_read(sslHandle, buffer2, sizeof(buffer2)) < 0);

  showMsg(buffer2);




  //释放SSL
  SSL_shutdown(sslHandle);
  SSL_free(sslHandle);
  SSL_CTX_free(sslContext);

  closesocket(s);

  WSACleanup();

  return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值