为什么套接字没有设置为非阻塞模式?

时间:2013-04-24 06:26:43

标签: sockets winapi common-lisp wininet

我尝试使用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。

1 个答案:

答案 0 :(得分:1)

如果它有帮助,则从WSAGetLastError获得的错误10045描述如下:

enter image description here

修改
在我的Windows系统上,我检查了调试器中FIONBIO的值,它应该是0x8004667E

Windows 8 SDK中winsock.hwinsock2.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就是您所获得的。