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
[ ~]$
Vielleicht hat das System nicht die gewünschte Auflösung und wird auf die nächste Mikrosekunde aufgerundet. –
@Someprogrammerdude: Es ist tatsächlich auf die nächste Millisekunde gerundet, Frage Millisekunde ist falsch, 'tv_usec' wird in Mikrosekunden gemessen. –
@BenVoigt, danke, habe die Frage bearbeitet. – ks1322