Socket C - время ожидания setsockopt делает некоторые вещи перед закрытием - PullRequest
0 голосов
/ 16 мая 2019

Я использую setsockopt с параметром SO_RCVTIMEO, чтобы установить тайм-аут для моей функции recv сокета.Это работает, но это немедленно закрывает сокет, когда время превышено.Я хочу отправить сообщение перед закрытием, возможно ли это?

(Моя программа должна работать в Windows и Linux)

Ответы [ 2 ]

0 голосов
/ 16 мая 2019

Я нашел метод: сокет выполняет recv () перед закрытием, поэтому я проверяю, получает ли сокет "" и могу ли я отправить свое сообщение.После этого сокет закрывается.

0 голосов
/ 16 мая 2019

Я думаю, что разумный способ реализовать это - использовать select (3) с таймаутом. Вот один пример: https://smnd.sk/anino/programming/c/unix_examples/poll.html Вы не просто используете recv, но используете select () с параметром timeout.

  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, ..);
          }
      }
  }
...