パケット受信タイムスタンプ
Linuxでパケット受信契機のタイムスタンプ採取方法。
ユーザーアプリからはsetsockoptでSO_TIMESTAMPを設定しておき、recvmsgで受信する都度せっせとCMSG_DATA(cmsg)経由で取得する形での仕組みが用意されている。具体的なコーディングサンプルだと
char inbuf[BUFSIZ];な感じだ。
char cmsgbuf[CMSG_SPACE(sizeof(struct timeval))];
struct cmsghdr *cmsg;
struct msghdr msghdr;
struct iovec msg_iov;
struct timeval *pTime, tv;
const int on = 1;
setsockopt(sock, SOL_SOCKET, SO_TIMESTAMP, &on, sizeof(on));
msg_iov.iov_base = inbuf;
msg_iov.iov_len = sizeof(inbuf);
msghdr.msg_name = NULL;
msghdr.msg_namelen = 0;
msghdr.msg_iov = &msg_iov;
msghdr.msg_iovlen = 1;
msghdr.msg_control = cmsgbuf;
msghdr.msg_controllen = sizeof(cmsgbuf);
while ( recvmsg(sock, &msghdr, ZERO) ){
/* Receive auxiliary data in msgh */
for (cmsg = CMSG_FIRSTHDR(&msghdr);
cmsg != NULL;
cmsg = CMSG_NXTHDR(&msghdr,cmsg)) {
if (cmsg->cmsg_level == SOL_SOCKET
&& cmsg->cmsg_type == SO_TIMESTAMP) {
pTime = (struct timeval *) CMSG_DATA(cmsg);
printf("cmsg time=%ld,%ld\n", pTime->tv_sec, pTime->tv_usec);
break;
}
}
}