我尝试使用ioctlsocket
将套接字设置为非阻止模式,但它返回-1
并且WSAGetLastError
返回10045
- 不支持操作。为什么会发生这种情况?
我编写的代码非常具体,因为它不是C ++,而是带有外语接口的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
- 一个常数,我通过谷歌搜索发现它的价值
no-block
- 指向u_long
的指针,u_long的值为1
。
ioctlsocket
返回-1,WSAGetLastError
返回10045。
答案 0 :(得分:1)
如果它有帮助,则从WSAGetLastError
获得的错误10045描述如下:
修改强>
在我的Windows系统上,我检查了调试器中FIONBIO
的值,它应该是0x8004667E
。
Windows 8 SDK中winsock.h
和winsock2.h
的定义如下:
#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
就是您所获得的。