可以转载,转载请注明出处,谢谢!
关于OpenSSL的原理以及OpenSSL如何安装、使用、测试demo请参看我之前的两篇博文。
这篇博文主要实现了如何在win64下基于VS2012实现OpenSSL的非阻塞通讯。参考了以下几篇博文的内容,表示感谢:
https://blog.csdn.net/fly2010love/article/details/46470033
https://www.cnblogs.com/dongfuye/p/4121066.html
https://wiki.openssl.org/index.php/Simple_TLS_Server
其实关键步骤有以下几步:
1. 让server和client创建一般的非OpenSSL套接字的时候就设置成非阻塞的,这个应该都清楚怎么设置。
2. 因为SSL_set_fd中添加的是非阻塞的一般的套接字,所以加上一行
SSL_set_connect_state(ssl);
ssl就变成了非阻塞的。
3. SSL_connect、SSL_accept、SSL_read、SSL_write的时候注意,由于是非阻塞的,可能当前缓冲没有数据,返回是0,此时根据SSL_get_error得到错误号,如果是SSL_ERROR_WANT_WRITE或者SSL_ERROR_WANT_READ,应该直接continue,而不应该判错。这个问题实际上跟一般的winsock套接字编程一样,一般的winsock套接字在设置成非阻塞的时候,如果当前connect、accept、read、write返回是0,不见得是出错,根据WSAGetLastError可以得到错误号可能会是10035,这个错误对应的是WSAEWOULDBLOCK,表示缓冲区没数据,应该阻塞,但由于设置成非阻塞了,所以才报错。但其实也是不应该判错的,应该continue。
至于如何配置测试服务器和客户端的demo,还是请看我之前的那篇文章的介绍。现在把非阻塞版本的demo服务器和客户端代码贴下。
服务器
/*****************************************************************
*SSL/TLS服务端程序WIN32版(以demos/server.cpp为基础)
*需要用到动态连接库libeay32.dll,ssleay.dll,
*同时在setting中加入ws2_32.lib libeay32.lib ssleay32.lib,
*以上库文件在编译openssl后可在out32dll目录下找到,
*所需证书文件请参照文章自行生成.
*****************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <errno.h>
#include <sys/types.h>
#include <iostream>
#include <winsock2.h>
#include "openssl/rsa.h"
#include "openssl/crypto.h"
#include "openssl/x509.h"
#include "openssl/pem.h"
#include "openssl/ssl.h"
#include "openssl/err.h"
using namespace std;
#pragma comment( lib, "ws2_32.lib" )
/*所有需要的参数信息都在此处以#define的形式提供*/
#define CERTF "server.crt" /*服务端的证书(需经CA签名)*/
#define KEYF "server.key" /*服务端的私钥(建议加密存储)*/
#define CACERT "ca.crt" /*CA 的证书*/
#define PORT 1111 /*准备绑定的端口*/
#define CHK_NULL(x) if ((x)==NULL) exit (1)
#define CHK_ERR(err,s) if ((err)==-1) { perror(s); exit(1); }
#define CHK_SSL(err) if ((err)==-1) { ERR_print_errors_fp(stderr); exit(2); }
int main ()
{
int err;
int listen_sd;
int sd;
struct sockaddr_in sa_serv;
struct sockaddr_in sa_cli;
int client_len;
SSL_CTX* ctx;
SSL* ssl;
X509*
文章浏览阅读751次。Python的__new__方法Python的__new__和__init__的区别先看一段代码#-*- coding:utf8 -*-""">>> A()new init<__main__.A object at 0x02473A30>"""class A(object): def __init__(self): pri_python new
文章浏览阅读455次。python的input和while使用一、Python input()函数:获取用户输入的字符串Python3.x 中 input() 函数接受一个标准输入数据,返回为 string 类型。Python2.x 中 input() 相等于 eval(raw_input(prompt)),用来获取控制台的输入。raw_input() 将所有输入作为字符串看待,返回字符串类型。而 ..._python while input
文章浏览阅读243次。I'm trying to understand Java reflecton and am encountering difficulties when working with non-Integer setter methods.As an example, how can I resolve the "getDeclaredMethod()" call below?import java...._aclass.getdeclaredmethod
文章浏览阅读876次。MySQL8.0.17 安装及配置1. 下载2. MySQL配置2.1 初始化2.2 配置环境变量2.3 安装2.4 修改密码1. 下载官网下载:https://dev.mysql.com/downloads/mysql/选择适合自己的版本,下载完成后解压到自己的文件夹下。2. MySQL配置2.1 初始化解压后的目录并没有的my.ini文件,没关系可以自行创建在安装根目录下添加的my..._rpm安装mysql8.0.17 如何设置端口
文章浏览阅读2.9w次,点赞10次,收藏7次。在Spring默认的AccessDeniedHandler中只有对页面请求的处理,而没有对Ajax的处理。而在项目开发是Ajax又是我们要常用的技术,所以我们可以通过自定义AccessDeniedHandler来处理Ajax请求。我们在Spring默认的AccessDeniedHandlerImpl上稍作修改就可以了。public class DefaultAccessDeniedHandle_accessdeniedhandler是干嘛的
文章浏览阅读7.4k次,点赞5次,收藏10次。flink消费kafka2.3.0,时报错,分区分配的不对Kafka Client Timeout of 60000ms expired before the position for partition could be determined在网上找了一波,没找到原因,后面,误打误撞,发现,是因为,kafka的配置文件,server.properties,使用了主机名作为配置,在server.properties中添加host.name=192.168.0.30 (当前所在服务器的i._timeout of 6000ms steam 解决
文章浏览阅读3.1k次。文章目录前言一、使用注意事项二、使用步骤1.下载后可以放入Kali里面通过Python运行。2.运行JSFinder.py总结前言JSFinder可以通过爬取网站各个页面的JS文件从而获得其中包含的网站的子域名,非常的好用,下面介绍JSFinder的使用方法,文章后面会给出JSFinder的下载地址。一、使用注意事项下载后通过命令行去直接执行,前提是Kali安装了python3及以上的版本,否则不行。二、使用步骤1.下载后可以放入Kali里面通过Python运行。2.运行JSF.._如何在kali中安装jsfinder
文章浏览阅读692次。文章目录概主要内容模型ELBO关于AAAYang M., Liu F., Chen Z., Shen X., Hao J. and Wang J. CausalVAE: disentangled representation learning via neural structural causal models. arXiv preprint arXiv:2004.086975, 2020.概隐变量的因果表示.主要内容我们通常希望隐变量zzz能够表示一些特别的特征, 通过改变zzz使得生成的_yang, m., liu, f., chen, z., shen, x., hao, j., wang, j. causalvae: disentan
文章浏览阅读284次。问题:用curl方法向远端服务器发请求,如果成功,远端服务器会返回数据,对方要求用application/x-www-form-urlencode的请求头传输请求参数的数据。一开始用的是:$header = array();header[]=′application/x−www−form−urlencode′;curlsetopt(header[] = 'applicatio..._curl 弊端
文章浏览阅读795次。在后台,Http服务器做的工作就是获取http请求,解析请求,用html文件作为body部分做http响应。wsgi的定义很简单,就是要求web应用开发者实现一个函数来响应Http请求。wsgi对于web应用开发者,屏蔽了http请求、解析,使其可专注于html文件的动态生成等业务逻辑。常用的静态服务器软件Apache、Nginx、Lighttpd等,python内置了一个wsg服务器,作为开发用_webinfo.wsgi模板文件
文章浏览阅读266次。题目设计函数求一元多项式的导数。输入格式:以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔。输出格式:以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是 0,但是表示为 0 0。输入样例:3 4 -5 2 6 1 -2 0输出样例:12 3 -10 1 6 ..._pat一元多项式求导 c++
文章浏览阅读2.4w次,点赞19次,收藏163次。本文记录了 ORB-SLAM2 在Ubuntu16.04下的安装过程._ubuntu16.04安装配置orb-slam2