Class: SFML::Network::Packet
- Inherits:
-
Object
- Object
- SFML::Network::Packet
- 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
-
#handle ⇒ Object
readonly
:nodoc:.
Instance Method Summary collapse
-
#append(bytes) ⇒ Object
Append a raw byte buffer (no length prefix, no type tag) — for interop with hand-crafted binary protocols.
- #clear ⇒ Object
-
#data ⇒ Object
Returns the full packet as a binary String.
- #dup ⇒ Object (also: #clone)
- #end_of_packet? ⇒ Boolean
-
#initialize ⇒ Packet
constructor
A new instance of Packet.
-
#ok? ⇒ Boolean
‘false` if the last read overran the packet — sfPacket “fails” quietly rather than raising, and subsequent reads return zero.
-
#read_bool ⇒ Object
—- typed readers —-.
- #read_double ⇒ Object
- #read_float ⇒ Object
- #read_int16 ⇒ Object
- #read_int32 ⇒ Object
- #read_int64 ⇒ Object
- #read_int8 ⇒ Object
- #read_position ⇒ Object
-
#read_string ⇒ Object
Read a length-prefixed string.
- #read_uint16 ⇒ Object
- #read_uint32 ⇒ Object
- #read_uint64 ⇒ Object
- #read_uint8 ⇒ Object
- #size ⇒ Object
-
#write_bool(v) ⇒ Object
—- typed writers —-.
- #write_double(v) ⇒ Object
- #write_float(v) ⇒ Object
- #write_int16(v) ⇒ Object
- #write_int32(v) ⇒ Object
- #write_int64(v) ⇒ Object
- #write_int8(v) ⇒ Object
- #write_string(str) ⇒ Object
- #write_uint16(v) ⇒ Object
- #write_uint32(v) ⇒ Object
- #write_uint64(v) ⇒ Object
- #write_uint8(v) ⇒ Object
Constructor Details
Instance Attribute Details
#handle ⇒ Object (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 |
#clear ⇒ Object
30 31 32 33 |
# File 'lib/sfml/network/packet.rb', line 30 def clear C::Network.sfPacket_clear(@handle) self end |
#data ⇒ Object
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 |
#dup ⇒ Object Also known as: clone
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
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.
62 |
# File 'lib/sfml/network/packet.rb', line 62 def ok? = C::Network.sfPacket_canRead(@handle) |
#read_bool ⇒ Object
—- typed readers —-
85 |
# File 'lib/sfml/network/packet.rb', line 85 def read_bool = C::Network.sfPacket_readBool(@handle) |
#read_double ⇒ Object
95 |
# File 'lib/sfml/network/packet.rb', line 95 def read_double = C::Network.sfPacket_readDouble(@handle) |
#read_float ⇒ Object
94 |
# File 'lib/sfml/network/packet.rb', line 94 def read_float = C::Network.sfPacket_readFloat(@handle) |
#read_int16 ⇒ Object
88 |
# File 'lib/sfml/network/packet.rb', line 88 def read_int16 = C::Network.sfPacket_readInt16(@handle) |
#read_int32 ⇒ Object
90 |
# File 'lib/sfml/network/packet.rb', line 90 def read_int32 = C::Network.sfPacket_readInt32(@handle) |
#read_int64 ⇒ Object
92 |
# File 'lib/sfml/network/packet.rb', line 92 def read_int64 = C::Network.sfPacket_readInt64(@handle) |
#read_int8 ⇒ Object
86 |
# File 'lib/sfml/network/packet.rb', line 86 def read_int8 = C::Network.sfPacket_readInt8(@handle) |
#read_position ⇒ Object
56 |
# File 'lib/sfml/network/packet.rb', line 56 def read_position = C::Network.sfPacket_getReadPosition(@handle) |
#read_string ⇒ Object
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_uint16 ⇒ Object
89 |
# File 'lib/sfml/network/packet.rb', line 89 def read_uint16 = C::Network.sfPacket_readUint16(@handle) |
#read_uint32 ⇒ Object
91 |
# File 'lib/sfml/network/packet.rb', line 91 def read_uint32 = C::Network.sfPacket_readUint32(@handle) |
#read_uint64 ⇒ Object
93 |
# File 'lib/sfml/network/packet.rb', line 93 def read_uint64 = C::Network.sfPacket_readUint64(@handle) |
#read_uint8 ⇒ Object
87 |
# File 'lib/sfml/network/packet.rb', line 87 def read_uint8 = C::Network.sfPacket_readUint8(@handle) |
#size ⇒ Object
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) |