用uint34打包一个字符串

时间:2013-08-20 09:12:59

标签: ruby sockets unix pack

我正在尝试通过套接字发送内容,所以我制作了一个简单的协议:

[消息长度(uint32)] [数据包ID(uint32)] [消息]

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

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.因此,它切换到“2时”,但不输出任何内容。

1 个答案:

答案 0 :(得分:1)

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

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

根据IO#read的文档,如果你没有传递一个长度,它会读到EOF,它应该可以得到所有东西。所以只需删除该长度参数:

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