对于来自客户端的每个HTTPS请求,服务器端的accept()是否取消阻止?

时间:2017-11-28 15:25:32

标签: c https winsock winsock2

我在从客户端向服务器发出HTTPS请求时遇到问题。

我的服务器在套接字之上使用Winsock和OpenSSL,而我的客户端使用的是WinHttp库。所有这些都是用C语言完成的。

以下是对网络通信期间服务器和客户端发生的事情(或我理解的情况)的描述:

在服务器端,在等待从客户端建立连接时,应用程序在accept()处被阻止。在客户端使用WinHttpSendRequest()发出的第一个HTTP请求时,accept()取消阻塞并创建一个新线程。然后,accept()再次进入阻塞状态,直到新客户端连接到它。

在服务器端的线程中,recv()接收客户端发送的数据包,然后通过send()通过响应数据包发送。

在从服务器接收到响应数据包后,客户端的WinHttpSendRequest()取消阻塞,然后继续执行WinHttpReceiveResponse()并将其余代码读入响应数据包的内容。

同时,服务器端的recv()阻塞,直到客户端通过WinHttpSendRequest()发送另一个请求,并且这种情况一直持续到服务器发送命令终止客户端。

这种在服务器端使用Winsock和在客户端使用WinHttp的机制适用于通过同一连接从客户端向服务器发送多个HTTP请求。

然而,当我决定为这种网络通信添加一层加密时,即。客户端发送HTTPS而不是HTTP请求,服务器使用openSSL函数接收和发送数据包(SSL_read()代替recv()和SSL_write代替send()),每次客户端发出WinHttpSendRequest(),接受服务器端的()将解除阻塞并返回一个新的套接字。在之前没有进行加密且请求是HTTP的情况下,服务器端的accept()只有当它是新客户端发出的第一个请求时才会解锁;将通过阻止和解除阻塞recv()来接收同一客户端的后续请求。

需要注意的一些事项:对于我的客户端,我保持WinHttpOpen和WinHttpConnect的句柄打开,而WinHttpOpenRequest和WinHttpSendRequest的句柄将在每次请求后关闭,并为每个新请求重新创建。此外,加密后可以正确读取双方收到的数据包(我知道加密是因为Wireshark嗅探的数据包不可读)。

我一直在网上搜索,看看是否有人经历过同样的事情,但无济于事:(有没有人可以向我解释为什么会这样?

0 个答案:

没有答案