A simple TCP messaging protocol?

ruby

Solution

It seems like there is no canonical, reusable solution.

So here's a basic implementation for the archives:

module Messaging
  # Assumes 'msg' is single-byte encoded 
  # and not larger than 4,3 GB ((2**(4*8)-1) bytes)
  def dispatch(msg)
    write([msg.length].pack('N') + msg)
  end

  def receive
    if (message_size = read(4)) # sizeof (N)
      message_size = message_size.unpack('N')[0] 
      read(message_size)
    end
  end
end

# usage
message_hub = TCPSocket.new('localhost', 1234).extend(Messaging)

Problem

I want to send messages between Ruby processes via TCP without using ending chars that could restrict the potential message content. That rules out the naïve socket.puts/gets approach. Is there a basic TCP message implementation somewhere in the standard libs?. (I'd like to avoid Drb to keep everything simple.)

Original source