ruby - 用 uint34 打包字符串

标签 ruby sockets unix pack

我试图通过套接字发送一些东西,所以我做了一个简单的协议(protocol),它是:

[消息长度(uint32)][包id(uint32)][消息]

那么,如何使用此协议(protocol)发送消息?我试过这个:

message = 'hi'
parent_socket.send([message.length, 2].pack('LL') + message, 0)

它似乎不起作用。我得到的只是长度和数据包ID。
我怎么能弄清楚这个?

(更新)
我用来接收消息的代码是:
if child_socket.ready?
  header = child_socket.read(8).unpack('LL')
  length = header[0]
  packet = header[1]
  case packet
    when 1
      stdin.write(child_socket.read(length))
    when 2
      puts child_socket.read(length)
      #send console
    else
      Console.show "Unknown packet : #{packet}"
end

输出为 10。看起来很正常 (4 + 4 + 2)

在这种情况下,长度为2,数据包为2。所以它切换到'when 2'但它什么也不输出。

最佳答案

问题是您只阅读前 8 个字节。

header = child_socket.read(8).unpack('LL')

根据 IO#read 的文档,如果您不传递长度,它将读取到 EOF,它应该得到所有内容。所以只需删除该长度参数:
header = child_socket.read.unpack('LL')

关于ruby - 用 uint34 打包字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18331232/

相关文章:

ruby - 字符串数组中的所有公共(public)子序列

java - 在 Netty 中以阻塞模式检查登录

c - 在 c 中创建的 minishell 无法按预期工作,与管道相关

Ruby:ActiveRecord - 第 N 行的索引

ruby-on-rails - Rails - 找不到类型为 'jquery_ujs' 的文件 'application/javascript'

java - TCP 客户端出现异常错误

c - 没有目标端口的 UNIX sendto()

java - 尝试在 unix 服务器中运行 jar 时出现 ClassNotFound 异常

oracle - 如何使用 REGEXP_SUBSTR 提取最后一个字符串?

ruby-on-rails - Rails 对象位于内存中但不在数据库中