ruby - 如何在 Ruby 中为 clamd 实现 INSTREAM 协议(protocol)?

标签 ruby sockets daemon

我正在努力在 Ruby 中实现 clamd 守护进程的 INSTREAM 命令。 这是clamd的文档

@file = File.open("input.txt")
socket = TCPSocket.new(HOST, PORT)
#writing the command
socket.write("zINSTREAM\0")
#streaming the chunk
socket.write(1024) #size of chunk
socket.write(@file.read(1024)) #chunk of data
#end the streaming
socket.write(0)
puts "Reading from the scoket"
puts socket.recv(1024)
socket.close

但我总是收到错误响应“超出 INSTREAM 大小限制。错误” 我在这里做错了什么?

最佳答案

经过长时间的斗争,我找到了解决方案。

chunk的大小必须在network byte order中用4字节无符号整数表示

所以

socket.write(1024)

应该是

socket.write([1024].pack("N"))

关于ruby - 如何在 Ruby 中为 clamd 实现 INSTREAM 协议(protocol)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12570680/

相关文章:

sockets - 我将如何在 crystal 中设置一个可以与多个客户端通信的简单 unix 套接字服务器?

c - 如何让守护进程与C中的子进程通信

ruby - 使用 AWS ruby​​ sdk 时出现错误 "The security token included in the request is invalid"

mysql - 通过 Rails 使用来自 AMPPS 的 MySQL

ruby-on-rails - Heroku 控制台无法启动 - 无法加载此类文件 --rack/handler/console

windows - 我一次可以打开多少个 TCP 套接字?

c - 如何使用 Netlink 套接字接收内核 uevents?

ruby-on-rails - Docker无法在Rails捆绑软件上构建安装rake

haskell - dupTo 与 STDOUT 相关的奇怪现象

c++ - 当守护线程在后台工作时返回一个函数 (c++)