Ruby:对Winsock2 ioctlsocket的Win32API调用失败,地址错误?

时间:2013-02-18 11:00:13

标签: ruby winapi winsock nonblocking

我想将Winsock2套接字从阻塞更改为非阻塞套接字。 我知道这可以通过调用ws2_32.dll库中的“ioctlsocket”函数来实现。 但我的实现无法实现其目的,返回值为-1,表示套接字错误。 我尝试通过调用WSAGetLastError来检索错误代码,并返回10014,我猜这与无效指针有关。 在这种情况下,我的错可能是什么? 我想这是我错误地将值声明或传递给API函数,但我无法弄明白为什么。 或者任何人都可以建议一种替代方法来使套接字无阻塞?

(由于某些原因,我不能使用Ruby的套接字类。)

这是我的代码(@fd是我的套接字的描述符):

proc = Win32API.new(“ws2_32”,“ioctlsocket”,“plp”,“l”) ret = proc.call(@ fd,0x8004667E,1)#FIONBIO p ret => -1

2 个答案:

答案 0 :(得分:1)

最后一个参数让你崩溃:

proc = Win32API.new("ws2_32", "ioctlsocket", "plp", "l") ret = proc.call(@fd, 0x8004667E, 1) # FIONBIO p ret => -1

ioctlsocket()的最后一个参数是一个长的指针,而不是一个长的(10014 return code是WSAEFAULT,这意味着它基本上是崩溃试图取消引用该参数) 。我不知道Ruby会告诉你如何形成一个指向长传的指针,但希望这足以让你走了。

答案 1 :(得分:1)

事实证明,我需要“打包”数组中的最后一个参数。 我认为这只是C风格结​​构的情况,但它以某种方式成功了。 现在套接字成功进入非阻塞模式。

工作代码如下所示:

proc.call(@ fd,0x8004667E,[1] .pack(“l”))#FIONBIO

但是,我不认为有人会需要这个。 Ruby自己的套接字实现功能强大,但比自己编写套接字包装器要简单得多。