2017-03-01 158 views
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 
[ ~]$ 
+0

也許系統沒有您要求的分辨率,並且可能達到最接近的微秒? –

+0

@Someprogrammerdude:它實際上是四捨五入到最接近的毫秒,問題提到的毫秒是不正確的,'tv_usec'以微秒爲單位。 –

+0

@BenVoigt,謝謝,編輯了這個問題。 – ks1322

回答

0

根據內核sources:設置SO_RCVTIMEOstruct tv轉換成long值,使用上HZ值算術。另一方面,當檢索SO_RCVTIMEO值時,從long值構建struct tv。因此,結果取決於時間分辨率(HZ值)以及算術分割和模數。

相關問題