当然不能这么放弃了,于是各种搜,终于明白了,https请求如何发出去和收到响应。
总的来说,需要经过以下步骤:
-
初始化OpenSSL
-
创建CTX上下文环境
-
建立TCP连接
-
创建SSL套接字,将SSL与TCP SOCKET 连接
-
建立SSL连接
-
然后就是通信,blablabla…
-
最后依次关闭连接和回收资源
-
关闭SSL套接字
-
释放SSL套接字
-
释放SSL会话环境
-
关闭TCP连接
-
退出程序(多余的2333)
当然代码如下(在linux环境下,且安装了openssl和libssl):
#include <arpa/inet.h>
#include <netdb.h>
#include <openssl/err.h>
#include <openssl/ssl.h>
#include <sys/socket.h>
#include <unistd.h>
#include <cstring>
#include <fstream>
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main() {
int client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
SSLeay_add_ssl_algorithms();
const SSL_METHOD *meth = SSLv23_client_method();
SSL_CTX *ctx = SSL_CTX_new(meth);
if (ctx == nullptr) {
cout << "SSL_CTX_new error !";
return -1;
if (client < 0) {
cout << "socket error !";
return -1;
string host = "www.baidu.com";
unsigned short port = 443;
hostent *ip = gethostbyname(host.c_str());
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(port);
sin.sin_addr = *(in_addr *)ip->h_addr_list[0];
if (connect(client, (sockaddr *)&sin, sizeof(sin)) < 0) {
cout << "connect error 1";
return -1;
int ret;
SSL *ssl = SSL_new(ctx);
if (ssl == nullptr) {
cout << "SSL NEW error";
return -1;
SSL_set_fd(ssl, client);
ret = SSL_connect(ssl);
if (ret == -1) {
cout << "SSL ACCEPT error ";
return -1;
stringstream stream;
stream << "GET https://" << host << " HTTP/1.0\r\n";
stream << "Accept: */*\r\n";
// br\r\n";//不要编码,否则还得多一个解码的步骤
stream << "Accept-Language: zh-Hans-CN, zh-Hans; q=0.8, en-US; q=0.5, en; "
"q=0.3\r\n";
stream << "Connection: Keep-Alive\r\n";
stream << "Host: " << host << "\r\n";
stream << "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 "
"Safari/537.36 Edge/17.17134\r\n";
stream << "\r\n";
string s = stream.str();
const char *sendData = s.c_str();
ret = SSL_write(ssl, sendData, strlen(sendData));
if (ret == -1) {
cout << "SSL write error !";
return -1;
char *rec = new char[1024 * 1024];
int start = 0;
while ((ret = SSL_read(ssl, rec + start, 1024)) > 0) {
start += ret;
rec[start] = 0;
cout << rec;
//关闭SSL套接字
SSL_shutdown(ssl);
//释放SSL套接字
SSL_free(ssl);
//释放SSL会话环境
SSL_CTX_free(ctx);
close(client);
最近用C++写爬虫,发现很不对劲。。。因为大部分网站都换成了https,每次获得的响应都是302。。提示重定向到他们的https站点上去,这太伤人心了,搞了半天,居然访问不了。当然不能这么放弃了,于是各种搜,终于明白了,https请求如何发出去和收到响应。总的来说,需要经过以下步骤:初始化OpenSSL创建CTX上下文环境建立TCP连接创建SSL套接字,将SSL与TCP SOCK...
windows下 c/c++实现TLS服务器, 发送HTTPS请求(基于openssl)
网上好像没多少相关的资料, 于是花了点时间, 封装了个服务出来玩玩, 转载请注明原作者以及本文链接
A, 引入openssl, 可以参考 引入openssl
B, 过程说明:
思路其实很简单,
1, 创建服务类
2, 监听端口
3, 开启线程不停的接收请求
4, 接收到请求后, 如果是tls, 则进行握手, 握手成功后, 再创建线程, 触发回调函数, 传入 客户端 类
5, 客户端类实现数据交互
6, 清除占用, 结束
相信各位对OpenSSL库已经不陌生了,目前笔者使用这个库实现了RSA、AES加解密和tcp的双向认证功能,下面来看tcp的双向认证。
1、什么是双向认证
简单说双向认证就是:客户端认证服务端是否合法,服务端认证客户端是否合法。
可以借助于HTTPS来说明,http网络传输协议是超文本的明文协议,也就是说经过网卡传输的字节序列都是明文,那么HTTPS上的s就是双向认证的操作(ssl),实际上就是在http的逻辑上再套一层ssl握手,进程想要发送的字节序列数据经过http传输时再加上一层ssl来让c和s两端先
* @Name - 创建TCP连接, 并建立到连接
* @Parame *server - 字符串, 要连接的服务器地址, 可以为域名, 也可以为IP地址
* @Parame port - 端口
* @return - 返回对应sock操作句柄, 用于控制后续通信
每当我尝试运行svn,它告诉我工作拷贝已经锁定。
我在查找和打开版本库时得到错误,而我知道我的版本库URL是正确的。
我怎样在file://的URL中指定一个Windows驱动器盘符?
通过网络对Subversion版本库进行写操作发生问题。
在Windows XP下,Subversion服务器有时候看起来发送损坏的数据。
跟踪Subversion客户端和Apache服务器通话最好的方法是什么?
我刚刚编译了二进制分发版本,当我尝试检出Subversion,我得到一个“Unrecognized URL scheme”错误。
为什么svn revert命令要有一个明确的目标?为什么缺省不是递归的?它的行为方式与大多数其它子命令不同。
当我启动Apache,mod_dav_svn抱怨说发现一个“bad database version”,它发现了db-3.X而不是db-4.X。
我在RedHat 9得到“Function not implemented”错误,无法工作,我如何修正这个问题?
为什么日志说通过Apache(ra_dav)提交或导入的文件“(no author)”?
我偶然在Windows得到“Access Denied”错误,它们看起来随即出现。
在FreeBSD,某些操作(特别是svnadmin create)有时会挂起。
我可以在web浏览器看到我的版本库,但是svn checkout给我一个301 Moved Permanently错误。
我尝试察看我的文件的一个老版本,但是svn告诉我“path not found”。
C. WebDAV和自动版本化
WebDAV基本概念
仅是平常的WebDAV
DeltaV扩展
Subversion和DeltaV
影射Subversion到DeltaV
自动版本化支持
选择mod_dav_lock
自动版本化交互性
Win32网络文件夹
Mac OS X
Unix: Nautilus 2
Linux davfs2
D. 第三方工具
客户端和插件
版本库转化
版本库浏览工具
E. 版权
1.1. Subversion的架构
2.1. 一个典型的客户/服务器系统
2.2. 需要避免的问题
2.3. 锁定-修改-解锁 方案
2.4. 拷贝-修改-合并 方案
2.5. 拷贝-修改-合并 方案(续)
2.6. 版本库的文件系统
2.7. 版本库
4.1. 分支开发
4.2. 开始规划版本库
4.3. 拷贝后的版本库
4.4. 一个文件的分支历史
8.1. 二维的文件目录
8.2. 版本时间—第三维!
2.1. 版本库访问URL
5.1. 版本库数据存储对照表
6.1. 网络服务器比较
8.1. Subversion库的摘要目录
5.1. 使用svnshell浏览版本库
5.2. txn-info.sh(异常事务报告)
6.1. 匿名访问的配置实例。
6.2. 一个认证访问的配置实例。
6.3. 一个混合认证/匿名访问的配置实例。
6.4. 关闭所有的路经检查
7.1. 注册表条目(.reg)样本文件。
8.1. 使用版本库层
8.2. 使用Python处理版本库层
8.3. 一段检出工作拷贝的简单脚本
8.4. 典型的.svn/entries文件内容
8.5. 有效地池使用
每当我尝试运行svn,它告诉我工作拷贝已经锁定。
我在查找和打开版本库时得到错误,而我知道我的版本库URL是正确的。
我怎样在file://的URL中指定一个Windows驱动器盘符?
通过网络对Subversion版本库进行写操作发生问题。
在Windows XP下,Subversion服务器有时候看起来发送损坏的数据。
跟踪Subversion客户端和Apache服务器通话最好的方法是什么?
我刚刚编译了二进制分发版本,当我尝试检出Subversion,我得到一个“Unrecognized URL scheme”错误。
为什么svn revert命令要有一个明确的目标?为什么缺省不是递归的?它的行为方式与大多数其它子命令不同。
当我启动Apache,mod_dav_svn抱怨说发现一个“bad database version”,它发现了db-3.X而不是db-4.X。
我在RedHat 9得到“Function not implemented”错误,无法工作,我如何修正这个问题?
为什么日志说通过Apache(ra_dav)提交或导入的文件“(no author)”?
我偶然在Windows得到“Access Denied”错误,它们看起来随即出现。
在FreeBSD,某些操作(特别是svnadmin create)有时会挂起。
我可以在web浏览器看到我的版本库,但是svn checkout给我一个301 Moved Permanently错误。
我尝试察看我的文件的一个老版本,但是svn告诉我“path not found”。
C. WebDAV和自动版本化
WebDAV基本概念
仅是平常的WebDAV
DeltaV扩展
Subversion和DeltaV
影射Subversion到DeltaV
自动版本化支持
选择mod_dav_lock
自动版本化交互性
Win32网络文件夹
Mac OS X
Unix: Nautilus 2
Linux davfs2
D. 第三方工具
客户端和插件
版本库转化
版本库浏览工具
E. 版权
1.1. Subversion的架构
2.1. 一个典型的客户/服务器系统
2.2. 需要避免的问题
2.3. 锁定-修改-解锁 方案
2.4. 拷贝-修改-合并 方案
2.5. 拷贝-修改-合并 方案(续)
2.6. 版本库的文件系统
2.7. 版本库
4.1. 分支开发
4.2. 开始规划版本库
4.3. 拷贝后的版本库
4.4. 一个文件的分支历史
8.1. 二维的文件目录
8.2. 版本时间—第三维!
2.1. 版本库访问URL
5.1. 版本库数据存储对照表
6.1. 网络服务器比较
8.1. Subversion库的摘要目录
5.1. 使用svnshell浏览版本库
5.2. txn-info.sh(异常事务报告)
6.1. 匿名访问的配置实例。
6.2. 一个认证访问的配置实例。
6.3. 一个混合认证/匿名访问的配置实例。
6.4. 关闭所有的路经检查
7.1. 注册表条目(.reg)样本文件。
8.1. 使用版本库层
8.2. 使用Python处理版本库层
8.3. 一段检出工作拷贝的简单脚本
8.4. 典型的.svn/entries文件内容
8.5. 有效地池使用
1.使用 get 向网站发送请求,http和https都支持哦!!
且能使用 .setHeader() 设置申请中的 Headers 头(重点)
* 2.使用Qstring中的 .arg(a) 对字符串进行更改
3.将网站返回的json成功解析(重点)
4.另外附赠一个超好用的网络接口
Web Service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的交互操作的应用程序。(来源于百度百科)。
优点:跨平台,跨语言调用。
由于项目需要调用webservice接口,网上大部分是java调用,c++部分很少,或者说不够系统。所以决定写下一个比较系统的调用过程。
第一步:生成头文件
webservice接口一般会有一个对外接口文档。比如:http://ww
要在C语言中使用HTTPS发送和接收请求,需要使用SSL/TLS库。常用的SSL/TLS库包括OpenSSL和GnuTLS。这些库提供了API,可以让开发者在C语言中使用HTTPS协议进行通信。
使用这些库发送HTTPS请求的一般步骤如下:
1. 初始化SSL/TLS库。
2. 创建SSL/TLS上下文对象。
3. 创建TCP连接。
4. 将TCP连接绑定到SSL/TLS上下文对象。
5. 建立SSL/TLS连接。
6. 发送HTTPS请求。
7. 接收HTTPS响应。
8. 关闭SSL/TLS连接和TCP连接。
需要注意的是,HTTPS请求和响应都是加密的,因此需要使用SSL/TLS库提供的加密和解密函数进行加密和解密操作。此外,还需要验证服务器的证书,以确保通信的安全性。