it-swarm.com.de

UDP-Socket-Zeitüberschreitung

Ich versuche, ein 100ms-Timeout für einen UDP-Socket festzulegen. Ich benutze C. Ich habe hier ein paar relevante Teile meines Codes gepostet. Ich bin mir nicht sicher, warum dies kein Zeitlimit ist, sondern hängt, wenn es kein Segment empfängt. Funktioniert dies nur für Sockets, die nicht mit der bind () -Methode gebunden sind?

#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++;
}
25
rharrison33

Die SO_RCVTIMEO-Option erwartet einen struct timeval, der in sys/time.h definiert ist, keine Ganzzahl, wie Sie sie übergeben. Der timeval struct hat als Sekundenfeld ein Feld und für Mikrosekunden ein Feld. Um das Zeitlimit auf 100 ms einzustellen, sollten die folgenden Schritte ausgeführt werden:

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");
}
45
Neal

Ich habe das gleiche Problem. Ich habe versucht, die von Ihnen vorgeschlagene Lösung mithilfe der timeval-Struktur zu übernehmen. Aber es schien nicht zu funktionieren. 

Ich habe die Microsoft-Dokumentation gelesen und die Zeit sollte eine DWORD mit der Anzahl von Millisekunden sein, aber es gibt noch eine andere Sache: Wenn der Socket mit der WSASocket-Funktion erstellt wird, muss für den dwFlags-Parameter das WSA_FLAG_OVERLAPPED-Attribut gesetzt sein das Timeout, um richtig zu funktionieren . Ansonsten wird das Timeout nie wirksam.

0
user9510357