【问题标题】:Socket C - setsockopt timeout do some things before closingSocket C - setsockopt timeout 在关闭前做一些事情
【发布时间】:2019-10-03 17:55:39
【问题描述】:

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

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

【问题讨论】:

  • recv() 不会在超时时关闭套接字。您的应用程序必须在 recv() 退出后执行此操作。

标签: c sockets timeout setsockopt


【解决方案1】:

我认为实现它的合理方法是使用带有超时的 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, ..);
          }
      }
  }

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多