Project

General

Profile

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()` ?

Back