如何在C ++中异步处理本机套接字上的https请求响应

时间:2015-06-03 10:18:57

标签: c++ sockets asynchronous

在我的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请求,请同时建议。

2 个答案:

答案 0 :(得分:2)

  

要在此本机套接字上发送https请求,我需要一些库,它将https有效负载作为输入,并返回https(SSL加密)http请求。这样我就可以直接在本机套接字上编写这个https请求。

     

处理https响应也是一样。 socket上的read / recv调用将返回缓冲区。我需要一些库来获取这个缓冲区并给我收到的https有效载荷。

没有。这将导致你的巨大痛苦,永远不会正常工作。 SSL不是块加密协议。这是协议。您永远无法以这种方式获得有效的实现。您可能会得到一个似乎在大多数情况下都可以工作的,但是当您(例如,本地发送触发SSL重新协商)时,您会发现它会中断。

您必须将SSL视为黑盒子,您绝不能尝试查看。由于SSL连接两个双向流协议,因此黑匣子有四个(名义上的)端口:

  1. 它有一个“加密数据输入”端口。从套接字接收数据时,必须将其提供给此端口。

  2. 它有一个“加密数据输出”端口。从此端口发送数据时,必须将其发送到套接字。

  3. 它有一个“明文输入”端口。如果要将数据发送到另一端,则必须将其发送到此端口。

  4. 它有一个“明文输出”端口。解密数据时,会在此端口上将其提供给您。

  5. 必须将这些端口视为独立的,并且一定不能假设,例如,在您向“明文输入”端口提供数据后,数据将会出现“加密数据输出”端口。为什么?因为引擎可能仍在等待重新协商完成。您必须假设因为您将数据提供给“加密数据输入”端口,这意味着数据将从“明文输出”端口出来。为什么?因为它可能是谈判数据,也可能是块的一部分。

    你正在考虑这个问题。回到绘图板,记住你正在实现一个双向字节流协议,它在另一个双向字节流协议之上。

    这是通过几十年的痛苦经历所获得的知识 - 忽视它会带来危险。

答案 1 :(得分:0)

快速而肮脏的方式:

一种方法是使用相同的libcurl在一个单独的线程中发出这些请求(libcurl线程报告回复主线程,其中处理回复)。如果性能成为问题,则线程池应该有所帮助。话虽如此,这种线程方法不会为您提供绝对最佳的性能。