实现套接字写入超时

时间:2017-06-04 07:53:25

标签: c sockets

您好我想知道数据是否在一段时间后没有通过套接字发送,我试图像这样实现它:

int write_t(int sock, void *buf, unsigned int len){
  fd_set set;
  struct timeval timeout;
  int rv;

  FD_ZERO(&set);
  FD_SET(sock, &set);

  timeout.tv_sec = RW_TIMEOUT;
  timeout.tv_usec = 0;

  rv = select(sock + 1, &set, NULL, NULL, &timeout);
  if(rv == -1)
    return -1;
  else if(rv == 0)
    return -2;
  else
    return write( sock, (unsigned int *)buf, len );
}

然而,当我使用此代码时,程序会阻塞timeout.tv_sec秒,并且不会发送任何内容。 这里有什么问题? 如何正确实现写入超时?

感谢。

1 个答案:

答案 0 :(得分:2)

您正在将FD设置为readfds,因此您在select中阻塞,直到套接字变为可读,这不会发生,因此您将获得超时。您应该将其设置为writefds

请注意,您所做的并不能保证数据实际已发送。它保证某些数据被传输到套接字发送缓冲区中,从而在TCP确定时,它将与写入异步发送。