sockets - 为什么套接字不设置为非阻塞模式?

标签 sockets winapi common-lisp wininet

我尝试使用 ioctlsocket 将我的套接字设置为非阻塞模式,但它返回 -1WSAGetLastError返回 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描述如下:

enter image description here

编辑
在我的 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/

相关文章:

c - socket - close(2) 发送 RST 数据包而不是 FIN 数据包

c - 如何优雅地关闭我的服务器?

c - send()和recv()是否实现可靠的数据传输(TCP协议(protocol))?

c++ - 成功时具有非零返回值的 WINAPI 方法

list - LISP 函数总是返回 nil

node.js - 为什么在 Node.js 中尝试重新连接 TCP 连接后会收到 ECONNREFUSED 错误?

c - 为什么这段代码不能在 windows XP 中运行

c++ - OpenGL 模板测试发生在片段程序运行之前还是之后?

lisp - 如何从此文本中删除括号

lisp - 通过嵌套列表 LISP 递归