我遇到Poco::HTTPSClientSession
的问题但不知道如何处理它。
使用Poco::HTTPSClientSession
类建立与服务器的HTTPS连接。连接建立,密钥交换,初始数据交换效果很好。
客户端在会话建立后直接发送一个请求。使用HTTP 1.1功能持久连接(即连接保持打开一段时间以处理其他请求)。服务器等待一分钟 - 没有通过此连接收到进一步的请求 - 然后发送close_notify
并关闭连接(使用TCP FIN)。大约两分钟后,客户端想要发送下一个请求。客户端发出close_notify
并使用TCP RST关闭连接。
客户端行为是恕我直言,不正确。您可以在RFC 6101 5.4.1. Closure Alerts中阅读,另一方应立即关闭连接:
要求对方以自己的close_notify警报响应并立即关闭连接,丢弃任何待处理的写入。
我不知道怎么用Poco来处理这件事。对我来说,它看起来需要一些回调处理(在服务器发送close_notify
时)。问题是,因为'socket()'方法在Poco::HTTPSClientSession
内受到保护,所以无法安装这样的close_notify
处理程序 - 甚至我也不知道是否有适当的回调对此。
当服务器发送close_notify
时,您能否提示我使用正确关闭客户端HTTPS连接的类/函数? [在Joachim Pileborg回答后补充]:是否需要继承Poco::HTTPSClientSession
以正确处理close_notify
?
亲切的问候 - 安德烈亚斯
答案 0 :(得分:0)
这是一个老问题,但由于没有任何可接受的回应我在这里提出我的解决方案,如果它可以帮助一些。
在向服务器发送请求之前执行此操作。
if (mySession->socket().poll(0, Poco::Net::Socket::SELECT_READ) && (mySession->socket().receiveBytes(NULL,0) == 0)) {
mySession->reset();
}
来自Poco文档:
bool poll(const Poco::Timespan& timeout, int mode) const;
/// Determines the status of the socket, using a
/// call to select().
///
/// The mode argument is constructed by combining the values
/// of the SelectMode enumeration.
///
/// Returns true if the next operation corresponding to
/// mode will not block, false otherwise.
int receiveBytes(void* buffer, int length, int flags = 0);
/// Receives data from the socket and stores it
/// in buffer. Up to length bytes are received.
///
/// Returns the number of bytes received.
/// A return value of 0 means a graceful shutdown
/// of the connection from the peer.
///
/// Throws a TimeoutException if a receive timeout has
/// been set and nothing is received within that interval.
/// Throws a NetException (or a subclass) in case of other errors.
如果您有一个打开的可读套接字,则select_read模式的poll方法将返回true。 使用receiveBytes读取服务器端正常关闭,然后为下一个请求重置套接字。