为多个请求重用相同的套接字连接

时间:2017-06-07 03:05:21

标签: c++ sockets tcp libevent multiplexing

这个问题可能稍微偏离主题,但我不知道还有什么要问的。我正在阅读此https://github.com/msgpack-rpc/msgpack-rpc/blob/master/spec.md,并看到该规范包括能够使用相同的连接发送乱序消息。

我之前完成TCP套接字编程的唯一方法是在套接字上同步发送请求,例如,我将打开一个套接字127.0.0.1,通过该套接字向该服务器发送请求并等待响应。当我收到我发送的请求的响应时,我通过在客户端上调用close()并在响应请求后调用服务器上的close()来关闭该连接。

对于后台,我正在使用libevent进行C ++项目,以执行与RPC系统非常相似的操作,因此我想知道在底层传输系统中应该使用哪个请求响应套接字循环。

在C ++ thrift中有一个名为open()的客户端方法(可能)打开一个连接并保持打开状态,直到你调用close()。这在抽象的系统中如何工作?例如,我在上面包含的messagepack-RPC链接。什么是最好的行动方案?如果没有,则打开一个连接,发送请求,并且当所有先前的请求都在该连接附近提供服务时(在服务器上,当所有未决请求都被响应时调用close())?或者我们是否必须以某种方式尝试将该连接保持活动一段时间,超出请求生命周期?服务器和客户端将如何知道该时间段是什么?例如,我们应该在套接字上注册一个读事件处理程序,并在recv()返回0时关闭连接吗?

如果这是一个不同系统解决方案不同的问题,那么有人可以指引我使用一种资源来阅读可能存在连接的模式(最好是在事件驱动系统中)吗?例如,我读到HTTP服务器始终保持连接打开,为什么?不保持每个连接都打开意味着服务器本质上会泄漏内存吗?

对于看似基本的问题感到抱歉,我以前只做过非常简单的TCP套接字编程,所以我可能不知道事情是怎么做的。

1 个答案:

答案 0 :(得分:2)

  1. 在客户端使用连接池。
  2. 在客户端中有一个后台线程,在一些超时后使空闲连接到期。
  3. 编写服务器,以便它可以处理每个接受的套接字上的多个请求,即循环读取请求和发送响应,直到对等方关闭连接,或读取请求发生读取超时,或发生套接字错误。
  4. 不要从任何一方发送密切的消息。 Closng套接字就足够了。
  5. 不要使用应用程序ping消息来保持连接活动。如果对等体或中间路由器认为连接如此昂贵以至于在一段时间后终止它们,那么您就没有任何企业试图欺骗它。
  6. 所有这些都是大多数HTTP实现已经运行的方式。注意两端的超时控制每个端的空闲资源使用情况。