2017-03-01 11 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_RCVTIMEOHZ値演算を使用して、long値にstruct tvを変換します。一方、SO_RCVTIMEOの値を取得する場合、struct tvlongの値から構成されます。したがって、結果は時間分解能(HZ値)、算術除算とモジュロに依存します。

関連する問題