我尝试使用 ioctlsocket
将我的套接字设置为非阻塞模式,但它返回 -1
和 WSAGetLastError
返回 10045
- 不支持操作。为什么会这样?
我写的代码相当具体,因为它不是 C++,而是带有外语接口(interface)的 Lisp(它允许从 dll 调用 C 和 C++ 函数),但实际上没关系,因为其他一切都可以工作。
这是代码:
(defconstant FIONBIO #x5421)
(setf socket-descriptor (socket AF_INET SOCK_STREAM IPPROTO_TCP))
...
(fli:with-dynamic-foreign-objects ((no-block (:unsigned :long) :initial-element 1))
(ioctlsocket socket-descriptor FIONBIO no-block))
...
socket-descriptor
- 只是一个套接字描述符,使用标准函数 socket
创建FIONBIO
- 一个常数,我发现它的值(value)只是通过谷歌搜索它no-block
- 指向 u_long
的指针, th u_long 的值为 1
.ioctlsocket
返回 -1 和 WSAGetLastError
返回 10045。
最佳答案
如果它有帮助,你从 WSAGetLastError
得到的错误 10045描述如下:
编辑
在我的 Windows 系统上,我检查了 FIONBIO
的值。在调试器中,它应该是 0x8004667E
.
它在 winsock.h
中都是这样定义的和 winsock2.h
在 Windows 8 SDK 中:
#define _IOW(x,y,t) (IOC_IN|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
#define FIONBIO _IOW('f', 126, u_long) /* set/clear non-blocking i/o */
如果您设置
unsigned int
等于 FIONBIO
,然后 0x8004667E
就是你得到的。
关于sockets - 为什么套接字不设置为非阻塞模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16184830/