Actions
Bug #19012
closedBasicSocket#recv* methods return an empty packet instead of nil on closed connections
Description
man recvmsg(2)
states:
Return Value
These calls return the number of bytes received, or -1 if an error occurred. The return value will be 0 when the peer has performed an orderly shutdown.
But somehow the entire receiv
family of methods in Ruby seem to interpret 0
as empty string instead of "EOF".
require 'socket'
puts "=== pipes ==="
r, w = IO.pipe
r.read_nonblock(1, exception: false) # => :wait_readable
w.close
r.read_nonblock(1, exception: false) # => nil (EOF)
puts "=== sockets ===="
r, w = UNIXSocket.socketpair
r.read_nonblock(1, exception: false) # => :wait_readable
r.recvmsg_nonblock(1, exception: false) # => :wait_readable
r.recv_nonblock(1, exception: false) # => :wait_readable
w.close
r.read_nonblock(1, exception: false) # => nil (EOF)
r.recvmsg_nonblock(1, exception: false) # => ["", #<Addrinfo: empty-sockaddr SOCK_STREAM>, 128]]
r.recvmsg # => ["", #<Addrinfo: empty-sockaddr SOCK_STREAM>, 0]]
r.recv_nonblock(1, exception: false) # => ""
Expected behavior¶
I would expect recvmsg_nonblock
, recvmsg
, recv_nonblock
and recv
to return nil
when the connection is closed.
Actions
Like0
Like0Like0Like0Like0Like0Like0Like0Like0