Issue #11958 has been reported by Marc Fournier.

----------------------------------------
Bug #11958: TCPSocket.getsockopt().bool raises a TypeError on windows
https://bugs.ruby-lang.org/issues/11958

* Author: Marc Fournier
* Status: Open
* Priority: Normal
* Assignee: 
* ruby -v: ruby 2.1.7p400 (2015-08-18 revision 51632) [x64-mingw32]
* Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN, 2.3: UNKNOWN
----------------------------------------
The following code snippet works as expected on linux (it returns "false"):

~~~
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:

~~~
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:

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



-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>