#c #sockets #udp #client-server
#c #сокеты #udp #клиент-сервер
Вопрос:
Я довольно новичок в кодировании. Я пишу простую клиент-серверную программу на C, которая отправляет ping через сокет UDP.
Моя проблема в том, что мне нужно, чтобы моя клиентская сторона игнорировала ответ после (например, 2 секунды), и вместо этого просто отправляла другой запрос и считала первый потерянным.
void waitReply(ping_t * pet, ssize_t * n_data_recv, clock_t * init_send){
size_t total_data_rcv = 0;
clock_t aux_intv;
while( total_data_rcv < (strlen(REPLY)) ){
*(n_data_recv) = recvfrom(pet->socket,pet->buffer,BUFFER_SIZE -1 , 0,(struct sockaddr *)0,(int *)0);
if(*(n_data_recv) < 0){
printf("Error: cannot recv datan");
exit(1);
}
total_data_rcv = *(n_data_recv);
pet->buffer[*n_data_recv] = '';
pet->data_recv = *(n_data_recv);
if(IntervalTimer(amp;aux_intv,init_send) > (0.9*INTERVAL_REQUEST)){
pet->pings_lost ;
break;
}
}
fnl = clock() - beg;
fnl= fnl / 1000;
if(total_data_rcv == (strlen(REPLY))){
pet->pings_rcv ;
printf("%d: Sent... RTT= %f msn", pet->pings_rcv,fnl);
if(fnl < min)
min = fnl;
if (fnl > max)
max = fnl;
}
}
Комментарии:
1. На самом деле вы не можете сказать ОС игнорировать ответ как таковой. Что вы можете сделать, так это установить тайм-аут, если ответ не получен через определенное время. Но имейте в виду, что вам все равно нужно будет получать и обрабатывать ответ, который поступает после истечения времени ожидания (вы можете «игнорировать» его в этот момент, просто ничего не делая с этим поздним ответом). Если вы действительно хотите получить тайм-аут, пожалуйста, обновите свой вопрос и выполните поиск по ключевым словам «recv timeout».
2. ОС не может узнать, какие ответы «запаздывают»; он сообщит вам о каждом поступающем ответе., Вам нужно будет самостоятельно отфильтровывать поздние ответы, возможно, помечая каждый запрос ping таким образом, чтобы он был отражен удаленным, чтобы вы могли определить, какие ответы являются «поздними».ответы принадлежат запросам, которые произошли более двух секунд назад.