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

时间:2014-07-28 22:10:07

标签: c sockets

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

谢谢,

修改 我使用德州仪器芯片的系统。 这是我目前的代码,它不起作用。 "连接"返回-1并且我没有错误来检查出错的地方。

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服务器会将请求的文件发送给我。

1 个答案:

答案 0 :(得分:0)

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

相关问题