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++;
}
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");
}
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.
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