IOCtlSocket Ruby Winapi

Posted

技术标签:

【中文标题】IOCtlSocket Ruby Winapi【英文标题】: 【发布时间】:2015-05-16 02:32:26 【问题描述】:

好吧,我正在尝试使用 ioctlsocket(FIONREAD) 获取要由 recv 读取的数据包的值,但是该函数没有返回任何值。

看:

IOCtlSocket = Win32API.new('ws2_32', 'ioctlsocket', 'llp', 'i') 

ret_val = -1
result = IOCtlSocket.call @descriptor, 0x4004667f, ret_val

if ret_val > 0 
print "Há pacotes a receber" 
end

ret_val 不会改变,无论我赋予它什么价值。

任何人有提示或解决方案?

【问题讨论】:

【参考方案1】:

最后一个参数是一个指针。指针在 Win32API 中实现为字符串。所以你需要做到以下几点:

IOCtlSocket = Win32API.new('ws2_32', 'ioctlsocket', 'llp', 'i') 

ret_val_buf = " " * 4 #Prepare a 4-byte buffer
result = IOCtlSocket.call @descriptor, 0x4004667f, ret_val_buf
ret_val = ret_val_buf.unpack("L")

【讨论】:

以上是关于IOCtlSocket Ruby Winapi的主要内容,如果未能解决你的问题,请参考以下文章

ioctlsocket 或 recv 在 Windows 套接字编程中需要更多时间来执行?

设置非阻塞的套接字Socket

VC++ socket编程中设置socket选项的ioctlsocketsetsockopt和WSAIoctl函数的使用(附源码)

C connect实现Timeout效果(Windows)

如何使 SSL 读取阻塞?

自己做的类库 封装socket类 请问怎样实现非阻塞模式