在我的C ++应用程序中,我使用epoll实现了“Reactor”设计模式。我有Reactor类,我在其中注册所有Fd(socketFd / EventFd / TimerFd)和各自的处理函数。当应用程序启动时,我运行Reactor的事件循环。
在此应用程序中,我必须发送https请求并处理收到的https响应。现在我使用CurlPP
(libcurl c ++包装器)发送此https请求。但这些是同步和阻塞呼叫。这妨碍了我的表现。
现在我想使用我的Reactor类异步处理这些https请求/响应。为此,我将创建本机套接字并连接到http服务器。在Reactor中注册此socketFd和相应的处理函数。
要在此本机套接字上发送https请求,我需要一些库,它将https有效负载作为输入,并返回https(SSL加密)http请求。这样我就可以直接在本机套接字上编写这个https请求。
处理https响应也是一样。 socket上的read / recv调用将返回缓冲区。我需要一些库来获取这个缓冲区并给我收到的https有效载荷。
我确实检查了libcurl中可用的API。但是libcurl没有给出这样的功能。它确实具有多手柄功能,但是套接字的控制还有libcurl本身。
您能否建议任何可以提供此类功能的图书馆?此外,如果您有任何其他方法异步处理这些https请求,请同时建议。
答案 0 :(得分:2)
要在此本机套接字上发送https请求,我需要一些库,它将https有效负载作为输入,并返回https(SSL加密)http请求。这样我就可以直接在本机套接字上编写这个https请求。
处理https响应也是一样。 socket上的read / recv调用将返回缓冲区。我需要一些库来获取这个缓冲区并给我收到的https有效载荷。
没有。这将导致你的巨大痛苦,永远不会正常工作。 SSL不是块加密协议。这是流协议。您永远无法以这种方式获得有效的实现。您可能会得到一个似乎在大多数情况下都可以工作的,但是当您(例如,本地发送触发SSL重新协商)时,您会发现它会中断。
您必须将SSL视为黑盒子,您绝不能尝试查看。由于SSL连接两个双向流协议,因此黑匣子有四个(名义上的)端口:
它有一个“加密数据输入”端口。从套接字接收数据时,必须将其提供给此端口。
它有一个“加密数据输出”端口。从此端口发送数据时,必须将其发送到套接字。
它有一个“明文输入”端口。如果要将数据发送到另一端,则必须将其发送到此端口。
它有一个“明文输出”端口。解密数据时,会在此端口上将其提供给您。
你必须将这些端口视为独立的,并且一定不能假设,例如,在您向“明文输入”端口提供数据后,数据将会出现“加密数据输出”端口。为什么?因为引擎可能仍在等待重新协商完成。您必须假设因为您将数据提供给“加密数据输入”端口,这意味着数据将从“明文输出”端口出来。为什么?因为它可能是谈判数据,也可能是块的一部分。
你正在考虑这个问题。回到绘图板,记住你正在实现一个双向字节流协议,它在另一个双向字节流协议之上。
这是通过几十年的痛苦经历所获得的知识 - 忽视它会带来危险。
答案 1 :(得分:0)
快速而肮脏的方式:
一种方法是使用相同的libcurl在一个单独的线程中发出这些请求(libcurl线程报告回复主线程,其中处理回复)。如果性能成为问题,则线程池应该有所帮助。话虽如此,这种线程方法不会为您提供绝对最佳的性能。