如何在SSL连接中等待整个缓冲区到达

如何在SSL连接中等待整个缓冲区到达,ssl,https,winsock,winsock2,Ssl,Https,Winsock,Winsock2,我正在实现一个客户机-服务器程序,其中客户机向服务器发送HTTP消息。它可以是HTTP或HTTPS 对于大型消息,如使用HTTP的文件传输,客户端一次性发送整个消息,而它以多个片段到达服务器(由网络完成)。我等待整个消息的到来,并不断地合并它,以便我得到整个消息。内容长度是使用我在HTTP消息中发送的参数找到的。 但在HTTPS的情况下,无法知道enitre消息是否已到达。 如果我解密片段,它将返回垃圾值。我认为这是因为,在解密之前,必须连接整个加密消息。 如何识别整个消息是否以HTTPs方式到

我正在实现一个客户机-服务器程序,其中客户机向服务器发送HTTP消息。它可以是HTTP或HTTPS 对于大型消息,如使用HTTP的文件传输,客户端一次性发送整个消息,而它以多个片段到达服务器(由网络完成)。我等待整个消息的到来,并不断地合并它,以便我得到整个消息。内容长度是使用我在HTTP消息中发送的参数找到的。 但在HTTPS的情况下,无法知道enitre消息是否已到达。 如果我解密片段,它将返回垃圾值。我认为这是因为,在解密之前,必须连接整个加密消息。 如何识别整个消息是否以HTTPs方式到达
我正在使用SSL库和windows套接字。

SSL将普通数据加密为块,然后将这些块分别传输给另一方。接收器需要读取原始套接字数据,并在数据到达时将其泵入SSL解密引擎。当引擎有足够的字节用于给定的块时,它将解密该块并仅输出该块的普通数据。因此,您只需继续读取套接字数据并将其泵入解密引擎,缓冲输出的任何普通数据,直到遇到表示HTTP消息头结尾的解密序列,然后处理这些头以确定HTTP消息体是否存在以及如何编码。如果存在消息体,则继续读取套接字数据,将其泵入解密引擎,并缓冲输出的普通数据,直到遇到消息体的结尾。描述如何确定HTTP消息体的编码(应用解密后)以及终止消息体的条件


换句话说,您不应该查找加密套接字消息的结尾。您应该解密收到的所有内容,直到检测到解密后的HTTP消息的结尾。

您应该能够在流到达时对其进行解密-听起来好像您的解密代码不起作用。@RichieHindle对于小消息,它工作得非常好。只有当大型缓冲区到达时,它才会以不同的片段到达,也就是当ssl解密功能失败时,ssl会增加或减少实际缓冲区长度吗?我从我的客户机发送了大约27000字节,我的服务器收到了12000和15000两个片段,但是当我读两次ssl_时,总长度大约是16000!剩余的数据去哪里了?SSL_read()为您处理套接字读取和引擎泵送。继续调用它,直到收到27000字节的解密数据。如果您没有收到预期的所有内容,则可能发件人没有发送27000字节的加密数据,或者您没有正确调用SSL_read()来接收27000字节的解密数据。My socket read()函数接收27000字节的数据,并将其传递给解密,但输出缓冲区大约为26000字节:(27000表示原始普通数据还是加密数据的大小?为什么要读取27000字节,然后分别解密?
SSL_read()
为您处理读取和解密。您所要做的就是为其提供一个输出缓冲区,以便将解密的数据接收到。您的代码显然有问题。请说明您实际在做什么。我所做的是在收到recv()的消息后函数,我使用Bio_Write,然后调用ssl_read。如果它返回-1,我等待来自recv()的更多数据并再次将其传递给ssl_read()。直到它返回大于0的值,我一直等待recv()上的数据。一旦所有数据到达,我多次调用ssl_read()并追加数据。这是正确的方法吗?