2

我想将我的 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

4

2 回答 2

1

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

工作代码如下所示:

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

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

于 2013-02-21T04:43:29.843 回答
1

最后一个参数让你崩溃:

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

ioctlsocket()的最后一个参数是指向long 而不是 long 的指针(10014 返回码是 WSAEFAULT,这基本上意味着它在尝试取消引用该参数时崩溃了)。我不知道足够的 Ruby 来告诉你如何形成一个指向 long 的指针来传递,但希望这足以让你继续前进。

于 2013-02-18T18:30:22.243 回答