1
我在Fedora 25上。在以下測試程序中,我將recv超時設置爲12秒,12345微秒與setsockopt
。但是當我用getsockopt
獲得超時值時,我會得到稍微不同的值:12秒,13000微秒。我預計它會和setsockopt
設置的一樣。爲什麼SO_RCVTIMEO在設置後超時有所不同?
爲什麼不同?
[ ~]$ 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
[ ~]$
也許系統沒有您要求的分辨率,並且可能達到最接近的微秒? –
@Someprogrammerdude:它實際上是四捨五入到最接近的毫秒,問題提到的毫秒是不正確的,'tv_usec'以微秒爲單位。 –
@BenVoigt,謝謝,編輯了這個問題。 – ks1322