套接字C-setsockopt超时在关闭之前先做一些事情

时间:2019-05-16 12:40:34

标签: c sockets timeout setsockopt

我使用带有SO_RCVTIMEO选项的setsockopt来在我的套接字recv函数上设置超时。 它可以工作,但是在超过时间后会立即关闭套接字。我想在关闭之前发送一条消息,可以吗?

(我的程序必须在Windows和Linux上运行)

2 个答案:

答案 0 :(得分:0)

我认为一种合理的实现方法是使用带有超时的select(3)。 这是一个例子: https://smnd.sk/anino/programming/c/unix_examples/poll.html 您不仅可以使用recv,还可以使用带有超时参数的select()。

  fd_set rfd;
  FD_ZERO(&rfd);
  // sock is your socket
  FD_SET(sock, &rfd);
  while (1)
  {
      timeval tv = { 1/*seconds*/, 0 /*ms*/ };
      int result = select(sock+1, &rfd, 0, 0, &tv);
      if (result == EINTR)
      {
          // timeout, send stuff and close(sock)
      }
      else if (result > 0)
      {
          if (!FD_ISSET(sock, &rfd))
          {
             recv(sock, ..);
          }
      }
  }

答案 1 :(得分:0)

我找到了一种方法: 套接字在关闭前执行recv(),因此我检查套接字是否接收到“”并且可以发送消息。之后,套接字将自己关闭。