Limit czasu zestawu gniazd UDP

Próbuję ustawić limit czasu 100ms na gnieździe UDP. Używam C. poniżej zamieściłem fragmenty mojego kodu. Nie jestem pewien, dlaczego to nie jest timing out, ale po prostu zawiesza się, gdy nie otrzymuje segmentu. Czy działa to tylko na gniazdach, które nie są związane za pomocą metody bind ()?

#define TIMEOUT_MS      100     /* Seconds between retransmits */

if ((rcv_sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
    DieWithError("socket() failed");

if ((rcv_sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
    DieWithError("socket() failed");

//set timer for recv_socket
static int timeout = TIMEOUT_MS;
setsockopt(rcv_sock, SOL_SOCKET, SO_RCVTIMEO,(char*)&timeout,sizeof(timeout));

if(recvfrom(rcv_sock, ackBuffer,sizeof(ackBuffer), 0,
       (struct sockaddr *) &servAddr2, &fromSize) < 0){
    //timeout reached
    printf("Timout reached. Resending segment %d\n", seq_num);
    num_timeouts++;
}
Author: rharrison33, 2012-11-25

2 answers

Opcja SO_RCVTIMEO oczekuje struct timeval zdefiniowanej w sys/time.h, a nie liczby całkowitej, jaką do niej przekazujesz. timeval struct ma pole dla sekund i pole dla mikrosekund. Aby ustawić timeout na 100ms, należy wykonać następujące czynności:

struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 100000;
if (setsockopt(rcv_sock, SOL_SOCKET, SO_RCVTIMEO,&tv,sizeof(tv)) < 0) {
    perror("Error");
}
 43
Author: Neal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-11 12:33:48

Mam ten sam problem. Próbowałem zaadoptować rozwiązanie, które zaproponowałeś, używając timeval struct. Ale wydawało się, że nie działa.

Przeczytałem w dokumentacji Microsoftu i czas powinien być {[1] } z liczbą milisekund, ale jest jeszcze coś do zrobienia, jeśli gniazdo jest utworzone przy użyciu funkcji WSASocket, to parametr dwFlags musi mieć ustawiony atrybut WSA_FLAG_OVERLAPPED, Aby timeout działał poprawnie. W przeciwnym razie timeout nigdy nie wchodzi w życie.

 0
Author: user9510357,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-18 01:26:49