gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:54:18 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com