Project

General

Profile

Actions

Bug #11958

closed

TCPSocket.getsockopt().bool raises a TypeError on windows

Added by mfournier (Marc Fournier) over 8 years ago. Updated about 8 years ago.

Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
ruby 2.1.7p400 (2015-08-18 revision 51632) [x64-mingw32]
[ruby-core:72730]

Description

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

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0