Если неблокирование recv с MESSAGE_PEEK успешно выполняется, будет последующий recv без MESSAGE_PEEK также успешно выполняться?

Вы можете использовать репозиторий Spring Data, чтобы сделать это следующим образом:

public interface LogRepository extends JpaRepository<Log, Long> {

  // just get one or null
  Log findOneByCreatedByAndCreatedDate(Instant createdBy, Instant createdDate);

  // get all, but pagable
  List<Log> findAllByCreatedByAndCreatedDate(Instant createdBy, Instant createdDate, Pageable pageable);

}

Я предполагаю, что вы используете Instant как метку времени, но это также должно работать для других типов дат Java 8 или старый Date класс.

В рамках вашей бизнес-логики вы теперь можете позвонить:

Log log = logRepository.findOneByCreatedByAndCreatedDate(YOUR_TIMESTAMP, Instant.now());

// or
Log allLogs = logRepository.findOneByCreatedByAndCreatedDate(YOUR_TIMESTAMP, Instant.now(), PageRequest.of(0, 50));
12
задан Michael Wolf 17 June 2010 в 17:30
поделиться

4 ответа

Стандарт POSIX определяет, что с MSG_PEEK «данные обрабатываются как непрочитанные, и следующая функция recv () или аналогичная функция все равно будет возвращать эти данные». Похоже, это означает, что если ret2 не равно -1, он будет таким же, как ret1.

9
ответ дан 2 December 2019 в 19:55
поделиться

Вы также должны учитывать возможность того, что другой вызов recv в другом потоке может быть вызван между ret1 и ret2. Этот другой вызов получит ваши данные, в результате чего ret2 останется без данных или с неожиданно меньшим объемом данных.

Если ваше приложение не является многопоточным или спроектировано так, что fd используется только этими двумя вызовами, тогда вы можете проигнорировать это. Но если это риск, то вам следует поместить два вызова в механизм блокировки.

5
ответ дан 2 December 2019 в 19:55
поделиться

I'm not sure about EAGAIN, but think that EBADF or ECONNRESET are possible.

1
ответ дан 2 December 2019 в 19:55
поделиться

В вашем простом случае последующий recv вернет количество байтов ret1 (если ret1 не было ошибкой). Однако для многопоточного дизайна это не всегда может быть правдой.

0
ответ дан 2 December 2019 в 19:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: