gpt4 book ai didi

c - 如何在没有 fcntl 的情况下创建非阻塞套接字?

转载 作者:行者123 更新时间:2023-11-30 17:30:43 25 4
gpt4 key购买 nike

我正在使用一个不运行 unix/linux/windows 或任何熟悉的操作系统的系统。然而,有一些套接字库,其中之一是socket.h。问题是那里有setsockopt函数和一些选项,但没有fcntl.h库。我发现这是获取和设置套接字标志的唯一方法(O_NONBLOCK 是我所寻求的)。另外,我看到可以将setsockopt与so_rcvtimeo和so_sndtimeo一起使用。我试过了,还是阻塞。当我在执行到达连接线之前拔掉以太网电缆时(当然是在 Debug模式下),连接功能被卡住了。有没有办法仅使用 socket.h 库来做到这一点?

谢谢

编辑:我正在使用带有德州仪器芯片的系统。这是我当前的代码,不起作用。 “connect”返回-1,我没有 errno 来检查出了什么问题。

if (setsockopt(s, SOL_SOCKET, SO_BLOCKING, (char *)&isBlockingOption, sizeof(isBlockingOption)) < 0) {
/* closing the socket and exiting */
}
connect(s, &controlAddressStruct, sizeof(controlAddressStruct));
FD_ZERO(&conSocketSet);
FD_SET(s, &conSocketSet);
connectTimeout.tv_sec = 5;
connectTimeout.tv_usec = 0;
selectRet = fdselect( (int)s + 1, NULL, &conSocketSet, NULL, &connectTimeout);
if (selectRet == 1) {
socketLen = sizeof(so_error);
getsockopt(s, SOL_SOCKET, SO_ERROR, &so_error, &socketLen);
if (so_error == 0) {
return s;
}
}
return INVALID_SOCKET;

现在,当以太网电缆插入两个系统之间时,so_error = 0 并返回 s。然后,当我读取 FTP 服务器回复时,出现错误,因此我退出程序。但是,如果我删除了 SO_BLOCKING 的 setsockopt,一切都会很好,FTP 服务器会向我发送请求的文件。

最佳答案

如果send()recv()接口(interface)与BSD套接字接口(interface)完全相似,则第四个参数应该对应于flags。如果是这样,您可以将 MSG_DONTWAIT 传递给第四个参数以实现非阻塞 I/O。

关于c - 如何在没有 fcntl 的情况下创建非阻塞套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25005181/

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