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