3

我将编写一个Linux客户端,它将与五个(左右)服务器建立套接字连接。客户端将向每个人发送一个“line”(一个字符串后跟“\n”),并从每个人那里收到一条回复。

我想在客户端使用select()epoll()但是,这是基于 TCP 和基于流的,当select()弹出时,我不能保证系统缓冲区中有整个“行” 。我正在寻找的是一个提供类似于epoll()sysread()的 API 的库,但它的工作基础是整数据被缓冲并准备好读取。

我很惊讶在我的互联网搜索中找不到这样的东西——我原以为这是一个相当普遍的需求。(也许我没有正确地表达这个问题。)写起来似乎不太难,但我怀疑开源解决方案会更防弹。

4

3 回答 3

2

看看 boost asio。特别是它有一个async_read_until功能

启动异步操作,将数据读入 streambuf,直到它包含分隔符、匹配正则表达式或函数对象指示匹配。

如果您使用的是 http,我还建议您使用支持异步客户端的 cpp-netlib

于 2013-01-27T00:42:07.077 回答
1

My MUSCLE networking library provides this (via the PlainTextMessageIOGateway class); it works well in my projects and it's BSD licensed so you're free to use it if you want. The included portableplaintextclient program in the tests subfolder is a very simple (94-line) example of how to use it. The other respondents are right, though, that it's not too difficult to just write the necessary buffering logic yourself, either; but if you want a pre-written/pre-debugged solution, this is one.

于 2013-01-27T01:14:40.110 回答
-1

哪有这回事。每个连接都需要一个缓冲区,并且需要按照 select()/poll()/epoll() 结果的指示读取它,直到有一行。这些 API 不像您那样关心行终止符。

于 2013-01-27T00:16:58.807 回答