Class: SFML::Network::Packet

Inherits:
Object
  • Object
show all
Defined in:
lib/sfml/network/packet.rb

Overview

Binary serializer with explicit, typed read/write — wire-compatible with SFML’s ‘sf::Packet`. Used by Tcp/UdpSocket’s ‘send_packet` /`receive_packet` (the network layer prepends a 4-byte length header for TCP framing, so the receiver always gets a whole packet).

All read calls consume bytes in FIFO order. After a write you can always re-read by sending the packet over the wire; the local read position only advances on the receive side. To rewind a locally-built packet, just construct a new one.

pkt = SFML::Network::Packet.new
pkt.write_int32(42)
pkt.write_string("hello")
pkt.write_float(0.5)

# … send over a TcpSocket, receive on the other end …

incoming.read_int32     #=> 42
incoming.read_string    #=> "hello"
incoming.read_float     #=> 0.5

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializePacket

Returns a new instance of Packet.

Raises:



24
25
26
27
28
# File 'lib/sfml/network/packet.rb', line 24

def initialize
  ptr = C::Network.sfPacket_create
  raise Error, "sfPacket_create returned NULL" if ptr.null?
  @handle = FFI::AutoPointer.new(ptr, C::Network.method(:sfPacket_destroy))
end

Instance Attribute Details

#handleObject (readonly)

:nodoc:



120
121
122
# File 'lib/sfml/network/packet.rb', line 120

def handle
  @handle
end

Instance Method Details

#append(bytes) ⇒ Object

Append a raw byte buffer (no length prefix, no type tag) — for interop with hand-crafted binary protocols. Most callers want ‘write_string` / `write_int32` etc. instead.



38
39
40
41
42
43
44
# File 'lib/sfml/network/packet.rb', line 38

def append(bytes)
  s = bytes.to_s
  buf = FFI::MemoryPointer.new(:uint8, s.bytesize)
  buf.write_bytes(s)
  C::Network.sfPacket_append(@handle, buf, s.bytesize)
  self
end

#clearObject



30
31
32
33
# File 'lib/sfml/network/packet.rb', line 30

def clear
  C::Network.sfPacket_clear(@handle)
  self
end

#dataObject

Returns the full packet as a binary String. Includes any length prefixes / type encoding sfPacket added on write.



48
49
50
51
52
53
# File 'lib/sfml/network/packet.rb', line 48

def data
  size = C::Network.sfPacket_getDataSize(@handle)
  return "".b if size.zero?
  ptr = C::Network.sfPacket_getData(@handle)
  ptr.read_bytes(size).force_encoding(Encoding::ASCII_8BIT)
end

#dupObject Also known as: clone

Raises:



109
110
111
112
113
114
115
116
117
# File 'lib/sfml/network/packet.rb', line 109

def dup
  ptr = C::Network.sfPacket_copy(@handle)
  raise Error, "sfPacket_copy returned NULL" if ptr.null?

  copy = self.class.allocate
  copy.instance_variable_set(:@handle,
    FFI::AutoPointer.new(ptr, C::Network.method(:sfPacket_destroy)))
  copy
end

#end_of_packet?Boolean

Returns:

  • (Boolean)


57
# File 'lib/sfml/network/packet.rb', line 57

def end_of_packet?  = C::Network.sfPacket_endOfPacket(@handle)

#ok?Boolean

‘false` if the last read overran the packet — sfPacket “fails” quietly rather than raising, and subsequent reads return zero. Check this after a read sequence to validate the frame.

Returns:

  • (Boolean)


62
# File 'lib/sfml/network/packet.rb', line 62

def ok? = C::Network.sfPacket_canRead(@handle)

#read_boolObject

—- typed readers —-



85
# File 'lib/sfml/network/packet.rb', line 85

def read_bool   = C::Network.sfPacket_readBool(@handle)

#read_doubleObject



95
# File 'lib/sfml/network/packet.rb', line 95

def read_double = C::Network.sfPacket_readDouble(@handle)

#read_floatObject



94
# File 'lib/sfml/network/packet.rb', line 94

def read_float  = C::Network.sfPacket_readFloat(@handle)

#read_int16Object



88
# File 'lib/sfml/network/packet.rb', line 88

def read_int16  = C::Network.sfPacket_readInt16(@handle)

#read_int32Object



90
# File 'lib/sfml/network/packet.rb', line 90

def read_int32  = C::Network.sfPacket_readInt32(@handle)

#read_int64Object



92
# File 'lib/sfml/network/packet.rb', line 92

def read_int64  = C::Network.sfPacket_readInt64(@handle)

#read_int8Object



86
# File 'lib/sfml/network/packet.rb', line 86

def read_int8   = C::Network.sfPacket_readInt8(@handle)

#read_positionObject



56
# File 'lib/sfml/network/packet.rb', line 56

def read_position   = C::Network.sfPacket_getReadPosition(@handle)

#read_stringObject

Read a length-prefixed string. CSFML expects a caller-allocated C buffer of “string length + 1 NUL” bytes — we size it from the remaining packet bytes, which is always an upper bound.



100
101
102
103
104
105
106
107
# File 'lib/sfml/network/packet.rb', line 100

def read_string
  remaining = size - read_position
  return "" if remaining <= 0

  buf = FFI::MemoryPointer.new(:char, remaining + 1)
  C::Network.sfPacket_readString(@handle, buf)
  buf.read_string.force_encoding(Encoding::UTF_8)
end

#read_uint16Object



89
# File 'lib/sfml/network/packet.rb', line 89

def read_uint16 = C::Network.sfPacket_readUint16(@handle)

#read_uint32Object



91
# File 'lib/sfml/network/packet.rb', line 91

def read_uint32 = C::Network.sfPacket_readUint32(@handle)

#read_uint64Object



93
# File 'lib/sfml/network/packet.rb', line 93

def read_uint64 = C::Network.sfPacket_readUint64(@handle)

#read_uint8Object



87
# File 'lib/sfml/network/packet.rb', line 87

def read_uint8  = C::Network.sfPacket_readUint8(@handle)

#sizeObject



55
# File 'lib/sfml/network/packet.rb', line 55

def size            = C::Network.sfPacket_getDataSize(@handle)

#write_bool(v) ⇒ Object

—- typed writers —-



65
66
67
# File 'lib/sfml/network/packet.rb', line 65

def write_bool(v)
  C::Network.sfPacket_writeBool(@handle, v ? true : false); self
end

#write_double(v) ⇒ Object



77
# File 'lib/sfml/network/packet.rb', line 77

def write_double(v) = (C::Network.sfPacket_writeDouble(@handle, Float(v));   self)

#write_float(v) ⇒ Object



76
# File 'lib/sfml/network/packet.rb', line 76

def write_float(v)  = (C::Network.sfPacket_writeFloat(@handle,  Float(v));   self)

#write_int16(v) ⇒ Object



70
# File 'lib/sfml/network/packet.rb', line 70

def write_int16(v)  = (C::Network.sfPacket_writeInt16(@handle,  Integer(v)); self)

#write_int32(v) ⇒ Object



72
# File 'lib/sfml/network/packet.rb', line 72

def write_int32(v)  = (C::Network.sfPacket_writeInt32(@handle,  Integer(v)); self)

#write_int64(v) ⇒ Object



74
# File 'lib/sfml/network/packet.rb', line 74

def write_int64(v)  = (C::Network.sfPacket_writeInt64(@handle,  Integer(v)); self)

#write_int8(v) ⇒ Object



68
# File 'lib/sfml/network/packet.rb', line 68

def write_int8(v)   = (C::Network.sfPacket_writeInt8(@handle,   Integer(v)); self)

#write_string(str) ⇒ Object



79
80
81
82
# File 'lib/sfml/network/packet.rb', line 79

def write_string(str)
  C::Network.sfPacket_writeString(@handle, str.to_s)
  self
end

#write_uint16(v) ⇒ Object



71
# File 'lib/sfml/network/packet.rb', line 71

def write_uint16(v) = (C::Network.sfPacket_writeUint16(@handle, Integer(v)); self)

#write_uint32(v) ⇒ Object



73
# File 'lib/sfml/network/packet.rb', line 73

def write_uint32(v) = (C::Network.sfPacket_writeUint32(@handle, Integer(v)); self)

#write_uint64(v) ⇒ Object



75
# File 'lib/sfml/network/packet.rb', line 75

def write_uint64(v) = (C::Network.sfPacket_writeUint64(@handle, Integer(v)); self)

#write_uint8(v) ⇒ Object



69
# File 'lib/sfml/network/packet.rb', line 69

def write_uint8(v)  = (C::Network.sfPacket_writeUint8(@handle,  Integer(v)); self)