Как настроить время ожидания повторной передачи в программе сокета C UDP? - PullRequest
1 голос
/ 02 марта 2012

У меня есть простая программа сокета UDP на C. Клиент передает данные на сервер и получает подтверждения.Я уже знаю, как настроить тайм-аут так, чтобы, если 'recvfrom ()' ничего не получал в течение определенного периода времени, будильник сработал.

ОДНАКО, есть еще несколько ситуаций, с которыми мне нужно разобраться,Что если я получу ответ с неожиданного адреса или ответ отформатирован неправильно?Я не хочу ретранслировать немедленно, только когда сработает будильник.

Дайте мне знать, если мне нужно уточнить.

Ответы [ 2 ]

1 голос
/ 02 марта 2012

Посмотрите на select(2) и poll(2) - вы можете ждать в сокете в течение определенного времени. Затем вы можете перезапустить ожидание с меньшим временем ожидания, если вам нужно.

Если вы используете Linux, посмотрите epoll(7) и timerfd_create(2).

0 голосов
/ 02 марта 2012

Вам нужно будет выполнить обработку полученных дейтаграмм, если вы хотите проверить и посмотреть, пришли ли они с неожиданного адреса или они неправильно отформатированы. Чтобы упростить обработку этих дел, вы должны создать конечный автомат, который будет обрабатывать ваши разные дела.

Например, у вас могут быть следующие состояния:

  • Время ожидания чтения
  • ошибка формата данных
  • неверный адрес передачи
  • действительные данные

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...