[ruby-core:74242] [Ruby trunk Bug#11958] TCPSocket.getsockopt().bool raises a TypeError on windows

From: nagachika00@...
Date: 2016-03-09 13:46:03 UTC
List: ruby-core #74242
Issue #11958 has been updated by Tomoyuki Chikanaga.

Backport changed from 2.0.0: REQUIRED, 2.1: DONE, 2.2: REQUIRED, 2.3: REQUIRED to 2.0.0: REQUIRED, 2.1: DONE, 2.2: DONE, 2.3: REQUIRED

Backported into `ruby_2_2` branch at r54067.

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

* Author: Marc Fournier
* Status: Closed
* Priority: Normal
* Assignee: 
* ruby -v: ruby 2.1.7p400 (2015-08-18 revision 51632) [x64-mingw32]
* Backport: 2.0.0: REQUIRED, 2.1: DONE, 2.2: DONE, 2.3: REQUIRED
----------------------------------------
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()` ?



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

In This Thread

Prev Next