2012-03-02 1 views
1

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

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

Сообщите мне, если мне нужно уточнить.

+0

сигнализация? вы скрепили сетевой код от beej? – tbert

+0

кто/что такое beej? – Groppe

ответ

1

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

Если вы работаете в Linux, изучите epoll(7) и timerfd_create(2).

0

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

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

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

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