<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>2007/10/05 on Yano&#39;s digital garage</title>
    <link>https://www.bravotouring.com/~yano/archives/2007/10/05/</link>
    <description>Recent content in 2007/10/05 on Yano&#39;s digital garage</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Fri, 05 Oct 2007 10:50:40 +0900</lastBuildDate>
    <atom:link href="https://www.bravotouring.com/~yano/archives/2007/10/05/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>パケット受信タイムスタンプ</title>
      <link>https://www.bravotouring.com/~yano/diary/it/20071005tstamp.htm</link>
      <pubDate>Fri, 05 Oct 2007 10:50:40 +0900</pubDate>
      <guid>https://www.bravotouring.com/~yano/diary/it/20071005tstamp.htm</guid>
      <description>&lt;p&gt;Linuxでパケット受信契機のタイムスタンプ採取方法。&lt;/p&gt;&#xA;&lt;p&gt;ユーザーアプリからは&lt;span class=&#34;Strong&#34;&gt;setsockopt&lt;/span&gt;で&lt;span class=&#34;Strong&#34;&gt;SO_TIMESTAMP&lt;/span&gt;を設定しておき、&lt;span class=&#34;Strong&#34;&gt;recvmsg&lt;/span&gt;で受信する都度せっせと&lt;span class=&#34;Strong&#34;&gt;CMSG_DATA(cmsg)&lt;/span&gt;経由で取得する形での仕組みが用意されている。具体的なコーディングサンプルだと&#xA;&lt;blockquote class=&#34;Log&#34;&gt;&#xA;    char    inbuf[BUFSIZ];&lt;br/&gt;&#xA;    char    cmsgbuf[CMSG_SPACE(sizeof(struct timeval))];&lt;br/&gt;&#xA;    struct  cmsghdr *cmsg;&lt;br/&gt;&#xA;    struct  msghdr  msghdr;&lt;br/&gt;&#xA;    struct  iovec   msg_iov;&lt;br/&gt;&#xA;    struct timeval  *pTime, tv;&lt;br/&gt;&#xA;    const int on = 1;&lt;br/&gt;&#xA;&lt;br/&gt;&#xA;&lt;span class=&#34;Strong&#34;&gt;setsockopt&lt;/span&gt;(sock, SOL_SOCKET, &lt;span class=&#34;Strong&#34;&gt;SO_TIMESTAMP&lt;/span&gt;, &amp;on, sizeof(on));&lt;br/&gt;&#xA;&lt;br/&gt;&#xA;    msg_iov.iov_base = inbuf;&lt;br/&gt;&#xA;    msg_iov.iov_len = sizeof(inbuf);&lt;br/&gt;&#xA;&lt;br/&gt;&#xA;    msghdr.msg_name = NULL;&lt;br/&gt;&#xA;    msghdr.msg_namelen = 0;&lt;br/&gt;&#xA;    msghdr.msg_iov = &amp;msg_iov;&lt;br/&gt;&#xA;    msghdr.msg_iovlen = 1;&lt;br/&gt;&#xA;    msghdr.msg_control = cmsgbuf;&lt;br/&gt;&#xA;    msghdr.msg_controllen = sizeof(cmsgbuf);&lt;br/&gt;&#xA;&lt;br/&gt;&#xA;    while ( &lt;span class=&#34;Strong&#34;&gt;recvmsg&lt;/span&gt;(sock, &amp;msghdr, ZERO) ){&lt;br/&gt;&#xA;        /* Receive auxiliary data in msgh */&lt;br/&gt;&#xA;        for (cmsg = CMSG_FIRSTHDR(&amp;msghdr);&lt;br/&gt;&#xA;            cmsg != NULL;&lt;br/&gt;&#xA;                cmsg = CMSG_NXTHDR(&amp;msghdr,cmsg)) {&lt;br/&gt;&#xA;            if (cmsg-&gt;cmsg_level == SOL_SOCKET&lt;br/&gt;&#xA;                &amp;&amp; cmsg-&gt;cmsg_type == &lt;span class=&#34;Strong&#34;&gt;SO_TIMESTAMP&lt;/span&gt;) {&lt;br/&gt;&#xA;                pTime = (struct timeval *) &lt;span class=&#34;Strong&#34;&gt;CMSG_DATA(cmsg);&lt;/span&gt;&lt;br/&gt;&#xA;                printf(&#34;cmsg time=%ld,%ld\n&#34;, pTime-&gt;tv_sec, pTime-&gt;tv_usec);&lt;br/&gt;&#xA;                break;&lt;br/&gt;&#xA;            }&lt;br/&gt;&#xA;        }&lt;br/&gt;&#xA;    }&lt;/blockquote&gt;&#xA;な感じだ。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
