Я разрабатываю приложение, которое отправляет много сообщений по UDP-соединению.
Иногда некоторые пакеты терялись, и после некоторых тестов я делаю вывод, что сокет был занят.
Таким образом, я помещаю крошечный сон между вызовами sendto API, пытаясь предотвратить новую отправку до того, как завершится последняя.
Это сработало, но я хочу использовать лучший подход, например обработать сигнал или что-то еще, что указывает мне, что предыдущая отправка была сделана.
Есть что-нибудь подобное?
Я использую язык C ++ в среде Linux.
Приведенный ниже фрагмент кода показывает, что я делаю:
#define MAX_SIZE 4096
string long_msg = GetLongMessage();
if (!long_msg.empty()) {
long int to_send = long_msg.size();
while (to_send) {
long int ret = sendto(socket_fd,
&long_msg[long_msg.size() - to_send],
(to_send > MAX_SIZE ? MAX_SIZE : to_send), 0,
reinterpret_cast<struct sockaddr*>(&addr_client),
addr_client_len);
if (ret > 0) {
to_send -= ret;
sleep(10);
} else {
// Log error
}
}
}
Изменить: Цель этого вопроса состоит в том, чтобы узнать, как определить, занят ли сокет UDP из-за предыдущего вызова отправки, и не обсуждать преимущества и недостатки TCP и UDP.
Задача ещё не решена.
Других решений пока нет …