读取缓冲区满

时间:2016-09-16 04:16:40

标签: c++ sockets winapi

我正在尝试在使用send之前检查套接字是否可写。这样工作正常,除非套接字的读缓冲区已满,然后select超时(至少那是我所期待的,行为是在向套接字发送大量数据之后)不使用recvselect返回0.如果我读了一些东西再试一次,它会再次正常运行)。我希望完整的读缓冲区不会阻止发送。我做错了什么?

int testwriteable(SOCKET socket) {
  timeval timeout;
  timeout.tv_sec = 0;
  timeout.tv_usec = 100; //100 us (microseconds)

  fd_set set;
  FD_ZERO(&set);
  FD_SET(socket, &set);

  //check for writable
  return select(1, NULL, &set, NULL, &timeout);
}

1 个答案:

答案 0 :(得分:1)

如果使用此代码select()超时,则表示发送缓冲区在整个超时期间已满。

但你做错了。你应该有一个主select()循环驱动你的代码,而不是这种控制反转,你应该(a)只在你有东西要写的时候写,(b)检测它何时返回-1 / EWOULDBLOCK / EAGAIN ,(c)此时将套接字FD添加到writeFDs集合并推迟写入,直到套接字变为可写。当发生这种情况时,重试写入(这意味着您已将数据及其长度排在某处),如果成功,则从writeFDs中删除套接字FD。

相关问题