如何正确关闭与Poco :: HTTPSClientSession的连接?

时间:2013-12-13 08:37:00

标签: c++ https connection poco-libraries termination

我遇到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

亲切的问候 - 安德烈亚斯

1 个答案:

答案 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读取服务器端正常关闭,然后为下一个请求重置套接字。