stdlib_libraries/socket_reading_lengths_no_parens.rb
tests/_examples/stdlib_libraries/socket_reading_lengths_no_parens.rb in the metorex repository.
# A socket read of a length waits for that many bytes or for the other end
# to finish, and a read with no length waits for the end. `eof?` waits for
# either and leaves what arrived to be read.
require "socket"
near, far = UNIXSocket.pair
far.write "abc"
waiting = Thread.new { near.read 10 }
Thread.pass until waiting.stop?
p waiting.status
far.write "defghijklm"
p waiting.value
far.close
p near.read
p near.read 5
server = TCPServer.new "127.0.0.1", 0
client = TCPSocket.new "127.0.0.1", server.addr[1]
peer = server.accept
peer.write "12"
p client.eof?
counted = Thread.new { client.read 4 }
Thread.pass until counted.stop?
peer.write "34"
p counted.value
peer.write "line one\r\n\r\nrest"
p client.gets "\r\n\r\n"
peer.close
p client.read
p client.eof?
p client.read 3
left, right = UNIXSocket.pair
left.write "foo"
p left.close_write
p right.read 4
Output:
"sleep"
"abcdefghij"
"klm"
nil
false
"1234"
"line one\r\n\r\n"
"rest"
true
nil
nil
"foo"