其目的是与使用json-rpc的OpenEthereum服务器进行交互。
问题一旦连接起来,我只需要在重新计算数据时做出反应,因为目的是订阅一个事件,所以我需要recv()函数来阻塞。但是在这种情况下,如果我要求在缓冲区中读取比服务器发送的内容更多的内容,请求将被阻塞。
OpenEthereum服务器用一个linefeed \n字符分隔它的请求,但我不知道这有什么帮助。
我知道的关于简单地等待recv() 超时的。但是我使用C++和ipc比我的竞争对手在套利上有更好的延迟,这也意味着我需要尽可能少的上下文切换。
如何有效地阅读无法预先确定长度的邮件?
发布于 2020-12-08 19:58:05
是否有一个函数来确定在unix域套接字上要读取的字节数?
不-只需继续进行非阻塞读取,直到返回EAGAIN或EWOULDBLOCK。
可能有一个特定于平台的ioctl或fcntl,但是您还没有命名一个平台,它既不是可移植的,也不是必需的。
如何有效地阅读无法预先确定长度的邮件?
只需对缓冲区进行非阻塞读取,该缓冲区足够大,足以包含您可能收到的最大消息。
我只需要在重新划分数据时做出反应,因为目的是订阅一个事件,所以我需要recv()函数来阻止
你混淆了两件事。
select或poll来等待套接字的可读性。只要阅读他们的手册,那是他们最常见的用例。EWOULDBLOCK或EAGAIN。对于这种基于流的协议,逻辑上还有第三步,即在发生部分消息时正确地管理缓冲区。哦,实际上解析了这些消息,但我假设您已经有了一个JSON库。
这是完全正常的,basic UNIX I/O设计。这不是一种奇异的优化。
https://stackoverflow.com/questions/65204661
复制相似问题