如何使用ioctl()在VxWorks中的套接字上设置FIONBIO?

时间:2012-07-25 16:17:16

标签: c++ sockets vxworks

VxWorks设置FIONBIO的标准方法是ioctl(),而不是fcntl()。 FIONBIO的文档以此为例,显然不会编译,因为on没有数据类型:

on = TRUE;
status = ioctl (sFd, FIONBIO, &on);

我已经看到网络上的示例用法,说使用这样的东西(基本上是相同的东西):

int on = 1;
ioctl(fd, FIONBIO, &on);

但是,文档说ioctl()的原型是ioctl(int, int, int),我收到有关无法将int*转换为int的错误消息。如果我将值作为int传递,我只会得到一个致命的内核任务级异常。

这是我目前的代码:

int SetBlocking(int sockfd, bool blocking)
{
  int nonblock = !blocking;
  return ioctl(sockfd, FIONBIO, &nonblock);
}

返回错误:

error: invalid conversion from `int*' to `int'
initializing argument 3 of `int ioctl(int, int, int)'

2 个答案:

答案 0 :(得分:2)

Found it here.

看起来我只需要将int*投射到int。我不能使用c风格的转换,所以我使用了reinterpret_cast

int SetBlocking(int sockfd, bool blocking)
{
  int nonblock = !blocking;

  return ioctl(sockfd,
    FIONBIO,
    reinterpret_cast<int>(&nonblock));
}

答案 1 :(得分:1)