1
3
对于命名管道,读和写是(或可以是)原子的。在限制范围内,如果将1024字节写入管道,则在另一端查找至少1024字节的读取调用实际上将接收1024字节,即使在读取时管道中有更多数据。此外,如果命名管道中只有1024个字节,并且读取请求为4096个字节,则在第一次尝试时它将获得1024个字节,而在随后的尝试中只会得到块。 你说:
你做…
是的,除非你在文件描述符上设置了“非块”…
你要发送什么样的信息?你要处理多大尺寸的?千字节,兆字节,更大?
比如说,在读卡器中有一个4KB的缓冲区,并以块的形式读取消息,没有什么特别的问题。问题是知道你何时到达信息的末尾。到目前为止,大多数协议都需要前面的长度,因为这样可以方便地可靠地编写读卡器代码。 如果你要做一个“结束流”(EOS)标记,你要做的是“带内信号”。这会带来麻烦。你要用什么角色?当该字符出现在数据中时会发生什么?您需要一个转义机制,例如一个表示“下一个字符不是EOS标记”的字符。例如,在与编程相关的文本中,反斜杠用于此目的。在终端,Control-V通常起作用。
为什么发送者很难知道缓冲区的大小?为什么它需要“垫掉”? 如果您处理的是大量数据(从千字节向上),那么单字符解决方案不太可能产生可接受的性能。我认为最好是让发送者能够确定数据包的大小并告诉读者,或者设计协议以便对数据包的大小有限制。如果您需要传输任意数量的数据,请制定一个协议,其中说明:
另外,如果您不想使用命名管道,而是想升级您的系统,使其通过套接字连接工作到另一台计算机,那么将来会发生什么。 我认为您应该用包头包含数据大小的包设计您的系统(大多数网络协议,如TCP/IP,都是这样做的)。如果有一个更高级别的未知大小的数据流,请按照上面概述的路线处理。但即使在那里,如果你能提前知道整体规模,那就更好了。 |
2
1
一种简单的方法是拥有一个包含ftok(基于命名管道)的离散数据包和指向共享内存中使用ftok返回值分配的以空结尾字符串的指针。所有其他离散信息都可以在包结构中传递。 发件人:
接收机:
注意,shmat中的地址没有明确提供,以防止在接收进程中重新映射现有内存。 |
GreenFerret95 · 福克斯与亲子沟通 7 年前 |
Mickey Tin · Android签名保护和导出=“false” 7 年前 |
Benp44 · ZMQ:连接ZMQ套接字时“资源暂时不可用” 7 年前 |
Ashish K · 命名管道卡在打开位置 7 年前 |
AIon · electron中两个浏览器窗口之间的通信 8 年前 |