Bug #11958
Updated by nobu (Nobuyoshi Nakada) over 8 years ago
The following code snippet works as expected on linux (it returns "false"): ~~~ruby ~~~ require 'net/http' http = Net::HTTP.new('192.168.111.21', 8080) http.start socket = http.instance_variable_get(:@socket).io socket.getsockopt(Socket::SOL_SOCKET, Socket::SO_KEEPALIVE).bool ~~~ But on windows, it raises this error: ~~~ TypeError: size differ. expected as sizeof(int)=4 but 1 from (irb):8:in `bool' from (irb):8 from irb:11:in `<main>' ~~~ (`TCPSocket.getsockopt().int` has the same problem.) Digging a bit further, I noticed what `socket.getsockopt().data` returns is platform-specific, despite `Socket::Option.bool().data` being the same on both platforms. On linux: ~~~ruby ~~~ socket.getsockopt(Socket::SOL_SOCKET, Socket::SO_KEEPALIVE).data "\x00\x00\x00\x00" Socket::Option.bool(:INET, :SOCKET, :KEEPALIVE, false).data "\x00\x00\x00\x00" ~~~ On windows: ~~~ruby ~~~ socket.getsockopt(Socket::SOL_SOCKET, Socket::SO_KEEPALIVE).data "\x00" Socket::Option.bool(:INET, :SOCKET, :KEEPALIVE, false).data "\x00\x00\x00\x00" ~~~ This might explain the `size differ. expected as sizeof(int)=4 but 1` raised by `getsockopt()` ?