Запретить отправку данных UDP, когда сетевое соединение недоступно
У меня есть приложение C, которое отправляет данные на сервер UDP каждые несколько секунд. Если клиент потеряет свое сетевое соединение на несколько минут, а затем восстановит соединение, он отправит все накопленные данные на сервер, что может привести к тому, что с этого клиента на сервер одновременно поступит сотня или более запросов.
Есть ли способ предотвратить отправку этих сообщений от клиента, если во время передачи по UDP произошла ошибка? Был бы connect
вызов из справки клиента UDP, чтобы определить, может ли клиент подключиться к серверу? Или это возможно только при использовании TCP?
int socketDescriptor;
struct sockaddr_in serverAddress;
if ((socketDescriptor = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
printf("Could not create socket. \n");
return;
}
serverAddress.sin_family = AF_INET;
serverAddress.sin_addr.s_addr = inet_addr(server_ip);
serverAddress.sin_port = htons(server_port);
if (sendto(socketDescriptor, data, strlen(data), 0,
(struct sockaddr *)&serverAddress, sizeof(serverAddress)) < 0)
{
printf("Could not send data to the server. \n");
return;
}
close(socketDescriptor);
2 ответа
Похоже, поведение, которое вы получаете, связано с буферизацией дейтаграмм в сокете sndbuf, и вы бы предпочли, чтобы эти дейтаграммы были отброшены, если их нельзя сразу отправить?
Если это так, возможно, вам повезет, установив размер sndbuf на ноль.
Слово предупреждения - эта область поведения звучит так, как будто она идет очень близко к "конкретной для реализации" территории.
Как объяснено здесь, для получения ошибок при отправке UDP вы должны использовать connect
раньше, то send
метод, но в Linux, похоже, такое же поведение с или без connect
,