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;
}