Запретить отправку данных UDP, когда сетевое соединение недоступно - PullRequest
0 голосов
/ 13 мая 2011

У меня есть приложение 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 ]

2 голосов
/ 13 мая 2011

Похоже, что поведение, которое вы получаете, связано с буферизацией дейтаграмм в сокете sndbuf, и вы бы предпочли, чтобы эти дейтаграммы были отброшены, если они не могут быть немедленно отправлены?

Если это так, возможно, вам повезет, установив размер sndbuf на ноль.

Слово предупреждения - эта область поведения звучит так, как будто она идет очень близко к "конкретной для реализации" территории.

0 голосов
/ 13 мая 2011

Как объяснено здесь , для извлечения ошибок при отправке UDP вы должны использовать connect раньше, затем метод send, но в Linux, похоже, такое же поведение с или без connect.

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