【问题标题】:Simultaneous connection issue with boost SSL connection增强 SSL 连接的同时连接问题
【发布时间】:2014-01-08 12:44:39
【问题描述】:

下面的伪代码解释了我所面临的情况

服务器端

while (<some condition>)
{
    // wait for SSL connection
    acceptor.async_accept();

    // wait until connection
    io_service.run();

    // perform handshake
    ssl_socket.handhake();

    // handshake successfully complete, start command manager thread
    pthread_create();

    io_service.reset();
    // Go for the new connection waiting
}

这里的问题是我能够连接两个客户端,但不能同时连接。 1 个连接到达之后,握手和证书验证需要 40-50 毫秒,因此,中间的任何连接请求都会失败。

更新:

有什么方法可以在握手过程中停止监听客户端问候? 我必须为每个循环创建新的io_service 实例,因为我可能想使用io_service.stop() 调用取消特定线程。 boost 还有其他选择吗?

【问题讨论】:

  • 当 TCP 握手在 OS 内核中完成以便 accept() 返回连接的套接字时,SSL 握手在用户空间中完成。这意味着在 socket.handshake() 中,应用程序将等待 SSL 客户端打招呼,执行某种昂贵的加密操作,然后发送 SSL 服务器打招呼。这需要一些时间,而且行为不端的客户端可能会因为在初始 TCP 连接后不发送任何内容而导致握手停止。
  • 感谢@SteffenUllrich,如果您有任何方法,请提出克服这种情况的方法。我是新手。
  • 我自己不使用 boost,但 SSL 处理在各种语言之间并没有太大区别。也许在这种情况下,就像将 SSL 握手移动到新创建的线程中一样简单,而不是在主线程中进行。
  • 感谢@Steffen 的所有帮助.. J

标签: c++ boost ssl client-server boost-asio


【解决方案1】:

同步ssl_socket.handshake() 将阻止接受其他连接。如果您需要异步行为,请使用 ssl_socket.async_handshake()

另外值得注意的是:您不需要每个线程的连接,因为这种设计不会超出琐碎的示例。

【讨论】:

  • 嗨 Sam,我尝试使用 async_handshake,但没有帮助。我的设计只是这样。可以进行 10 个连接,并且每个连接都会启动命令线程。
猜你喜欢
  • 2017-11-25
  • 1970-01-01
  • 2010-10-23
  • 1970-01-01
  • 2021-11-20
  • 1970-01-01
  • 1970-01-01
  • 2014-09-13
  • 1970-01-01
相关资源
最近更新 更多