当然不能这么放弃了,于是各种搜,终于明白了,https请求如何发出去和收到响应。

总的来说,需要经过以下步骤:

  1. 初始化OpenSSL
  2. 创建CTX上下文环境
  3. 建立TCP连接
  4. 创建SSL套接字,将SSL与TCP SOCKET 连接
  5. 建立SSL连接
  6. 然后就是通信,blablabla…
  7. 最后依次关闭连接和回收资源
    1. 关闭SSL套接字
    2. 释放SSL套接字
    3. 释放SSL会话环境
    4. 关闭TCP连接
  8. 退出程序(多余的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);
    //添加SSL的加密/HASH算法
    SSLeay_add_ssl_algorithms();
    //客户端,服务端选择SSLv23_server_method()
    const SSL_METHOD *meth = SSLv23_client_method();
    //建立新的SSL上下文
    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;
    //建立SSL
    int ret;
    SSL *ssl = SSL_new(ctx);
    if (ssl == nullptr) {
        cout << "SSL NEW error";
        return -1;
    //将SSL与TCP SOCKET 连接
    SSL_set_fd(ssl, client);
    // SSL连接
    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";
    // stream << "Accept-Encoding: gzip, deflate,
    // 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库提供的加密和解密函数进行加密和解密操作。此外,还需要验证服务器的证书,以确保通信的安全性。