非阻塞、基于行的套接字I/O的C++库?

3
我将编写一个Linux客户端,该客户端将与五个(或更多)服务器建立套接字连接。客户端会向每个服务器发送一条“行”(一个字符串后跟“\n”),并从每个服务器接收一条“行”。
我想在客户端中使用select()或epoll(),但由于TCP和基于流的特性,当select()弹出时,并不能保证系统缓冲区中有整个“行”。我正在寻找一个类似于epoll()和sysread()的库,但它是基于整个数据“行”被缓冲并准备好读取。
我很惊讶在我的互联网搜索中没有找到任何类似的东西 - 我本以为这是一个相当常见的需求。(也许我没有正确表达问题。)写起来似乎不太困难,但我认为开源解决方案会更加可靠。
3个回答

2
看一下boost asio。特别是它有一个async_read_until函数,它可以执行以下操作:

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

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

那似乎是符合我的需求的,尽管我希望有类似于select()或epoll()的更并行的东西。可能不得不咬紧牙关学习asio。(顺便说一句,我没有使用http。) - Chap
需要一些思维/架构上的变化,才能转向更加事件驱动的“处理程序”系统。 - timday

1

我的MUSCLE网络库可以通过PlainTextMessageIOGateway类提供这个功能;它在我的项目中运作良好,并且采用BSD许可证,如果您想要使用它,可以自由使用。测试子文件夹中包含的portableplaintextclient程序是一个非常简单(94行)的示例。其他回答者是正确的,不过,编写所需的缓冲逻辑也不是太难;但是,如果您想要一个预先编写/预调试的解决方案,那么这就是一个选择。


谢谢。有趣的是,你住在我附近两个街区的地方! - Chap
我需要吗?我在加利福尼亚州帕萨迪纳;您的信息页面显示您在科罗拉多州博尔德? - Jeremy Friesner
我明白了 - 那么与MUSCLE相关联的地址是两个街区之外。 // 哦!没关系。那只是一则广告。>:-O - Chap

-1

这样的东西是不存在的。你需要为每个连接准备一个缓冲区,并根据 select()/poll()/epoll() 的结果读取数据,直到读取到一行为止。这些 API 并不像你一样关心行终止符。


我知道 - 我正在寻找第三方解决方案。 - Chap
1
@Chap 我怀疑你不会为这么简单的问题找到一个解决方案。这只是几行代码而已。 - user207421
@downvoter 请解释一下。有一种叫做select()的东西,它确实关心行终止符吗?你不需要为每个连接使用缓冲区吗? - user207421
没有冒犯的意思!但是你的回答并没有给我提供任何新信息(你会注意到我确实提到了需要缓冲)。也许自己编写确实很简单,但通常有人已经处理了我没有考虑过的其他问题。 - Chap
你的答案没有提及每个套接字需要缓冲区的需要,如果你是那个投票者,我感到非常惊讶。 - user207421
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接