2017-03-01 3 views
1

Ich bin auf Fedora 25. Im folgenden Testprogramm habe ich recv Timeout auf 12 Sekunden, 12345 Mikrosec mit setsockopt gesetzt. Aber wenn ich Timeout-Wert mit getsockopt bekomme, bekomme ich etwas anderen Wert: 12 Sekunden, 13000 Mikrosekunden. Ich erwarte, dass es so ist, wie es von setsockopt festgelegt wurde.Warum unterscheidet sich SO_RCVTIMEO Zeitüberschreitung, nachdem es festgelegt wurde?

Warum unterscheidet sich?

[ ~]$ cat sockopt.c 
#include <stdio.h> 
#include <sys/time.h> 
#include <sys/socket.h> 

int main() 
{ 
    int sd = socket(AF_INET, SOCK_STREAM, 0); 
    int rc; 
    struct timeval tv; 
    socklen_t len = sizeof(tv); 

    tv.tv_sec = 12; 
    tv.tv_usec = 12345; 
    rc = setsockopt(sd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); 
    if (rc < 0) printf("oops\n"); 

    rc = getsockopt(sd, SOL_SOCKET, SO_RCVTIMEO, &tv, &len); 
    if (rc < 0) printf("oops\n"); 
    printf("%ld, %ld\n", tv.tv_sec, tv.tv_usec); 
} 
[ ~]$ 
[ ~]$ gcc -Wall sockopt.c 
[ ~]$ 
[ ~]$ ./a.out 
12, 13000 
[ ~]$ 
+0

Vielleicht hat das System nicht die gewünschte Auflösung und wird auf die nächste Mikrosekunde aufgerundet. –

+0

@Someprogrammerdude: Es ist tatsächlich auf die nächste Millisekunde gerundet, Frage Millisekunde ist falsch, 'tv_usec' wird in Mikrosekunden gemessen. –

+0

@BenVoigt, danke, habe die Frage bearbeitet. – ks1322

Antwort

0

Nach dem Kernel sources: wenn die SO_RCVTIMEO Einstellung wandelt die struct tv in einen long Wert, auf den Wert unter Verwendung HZ Arithmetik. Auf der anderen Seite wird beim Abrufen des SO_RCVTIMEO Wertes ein struct tv aus dem long Wert erstellt. Daher hängt das Ergebnis von der Zeitauflösung (dem HZ Wert) und den arithmetischen Unterteilungen und Modulos ab.

Verwandte Themen