stdlib_libraries/socket_options_no_parens.rb

tests/_examples/stdlib_libraries/socket_options_no_parens.rb in the metorex repository.

# Socket.new opens a descriptor straight away, so a socket's settings are
# the operating system's to read and change before it is bound. A value is
# written as a C int when it is a number or a boolean, and as raw bytes
# when it is a String.
require "socket"

socket = Socket.new(:INET, :STREAM)
p socket.getsockopt(:SOCKET, :TYPE).int == Socket::SOCK_STREAM
p socket.setsockopt(:SOCKET, :REUSEADDR, true)
p socket.getsockopt(:SOCKET, :REUSEADDR).bool
p socket.setsockopt(:IP, :TTL, 64)
p socket.getsockopt(:IP, :TTL).int
socket.setsockopt Socket::Option.linger(true, 10)
p socket.getsockopt(:SOCKET, :LINGER).linger.last

begin
  socket.setsockopt(:SOCKET, :LINGER, 0)
rescue SystemCallError => error
  p [error.class, error.message]
end
begin
  socket.setsockopt(:SOCKET, :SNDBUF, nil)
rescue TypeError => error
  p error.message
end
socket.close

Output:

true
0
true
0
64
10
[Errno::EINVAL, "Invalid argument - setsockopt(2)"]
"no implicit conversion of nil into String"