www.mtkn.jp

Manuscripts for my personal webpage.
git clone https://git.mtkn.jp/www.mtkn.jp
Log | Files | Refs | LICENSE

commit 575bc6cd845f4aa234e6d23afedd8820b228576e
parent 059c0b65063d1e024aa0e9a54052e1ee7075597f
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Sun, 10 Nov 2024 20:23:49 +0900

update

Diffstat:
Mman/draft/9p.html | 38++++++++++++++++++++++++++++++++++++++
Mpub/draft/9p.html | 30++++++++++++++++++++++++++++++
Mpub/rss.xml | 4++--
3 files changed, 70 insertions(+), 2 deletions(-)

diff --git a/man/draft/9p.html b/man/draft/9p.html @@ -489,6 +489,44 @@ size[4] Rwstat tag[2] <h2>Goによる実装</h2> <h3>メッセージの構造体の定義</h3> +<p> +メッセージには<code>size</code>、<code>tag</code>等共通の要素がある。\ +クライアントからメッセージを受けとる際、\ +<code>size</code>を参照して何バイト読むか判断し、\ +メッセージの<code>type</code>によりその後の処理を場合分けする。\ +そのためにメッセージを<code>interface</code>として定義した: +</p> +<pre><code>\ +// A Msg represents any kind of message of 9P. +// It defines methods for common fields. +// For each message type &lt;T&gt;, new&lt;T&gt;([]byte) function parses the byte array +// of 9P message into the corresponding message struct. +// For detailed information on each message, consult the documentation +// of 9P protocol. +type Msg interface { + // Size returns the size field of message. + // Size field holds the size of the message in bytes + // including the 4-byte size field itself. + Size() uint32 + // Type returns the type field of message. + Type() MsgType + // GetTag returns the Tag of message. + // Tag is the identifier of each message. + // The Get prefix is to avoid name confliction with the each + // message's Tag field. + GetTag() uint16 + // SetTag sets the Tag field of the message. + SetTag(uint16) + // Marshal convert Msg to byte array to be transmitted. + marshal() []byte + String() string +} +</code></pre> +<p> +<code>marshal()</code>はサーバーから返信を送る際に\ +メッセージの構造体をバイト列にエンコードするための関数である。\ +<code>String() string</code>はログ出力用。\ +</p> <h3>メッセージのやりとり</h3> <p> まずは9Pメッセージを読む関数を実装する。\ diff --git a/pub/draft/9p.html b/pub/draft/9p.html @@ -310,6 +310,36 @@ size[4] Rwstat tag[2] <h2>Goによる実装</h2> <h3>メッセージの構造体の定義</h3> +<p> +メッセージには<code>size</code>、<code>tag</code>等共通の要素がある。クライアントからメッセージを受けとる際、<code>size</code>を参照して何バイト読むか判断し、メッセージの<code>type</code>によりその後の処理を場合分けする。そのためにメッセージを<code>interface</code>として定義した: +</p> +<pre><code>// A Msg represents any kind of message of 9P. +// It defines methods for common fields. +// For each message type &lt;T&gt;, new&lt;T&gt;([]byte) function parses the byte array +// of 9P message into the corresponding message struct. +// For detailed information on each message, consult the documentation +// of 9P protocol. +type Msg interface { + // Size returns the size field of message. + // Size field holds the size of the message in bytes + // including the 4-byte size field itself. + Size() uint32 + // Type returns the type field of message. + Type() MsgType + // GetTag returns the Tag of message. + // Tag is the identifier of each message. + // The Get prefix is to avoid name confliction with the each + // message's Tag field. + GetTag() uint16 + // SetTag sets the Tag field of the message. + SetTag(uint16) + // Marshal convert Msg to byte array to be transmitted. + marshal() []byte + String() string +} +</code></pre> +<p> +<code>marshal()</code>はサーバーから返信を送る際にメッセージの構造体をバイト列にエンコードするための関数である。</p> <h3>メッセージのやりとり</h3> <p> まずは9Pメッセージを読む関数を実装する。バイト列が読めればいいので引数は<code>io.Reader</code>にした: diff --git a/pub/rss.xml b/pub/rss.xml @@ -5,8 +5,8 @@ <description>ウェブページの更新履歴</description> <language>ja-jp</language> <link>https://www.mtkn.jp</link> -<lastBuildDate>Sat, 9 Nov 2024 21:28:44 +0900</lastBuildDate> -<pubDate>Sat, 9 Nov 2024 21:28:44 +0900</pubDate> +<lastBuildDate>Sun, 10 Nov 2024 20:02:27 +0900</lastBuildDate> +<pubDate>Sun, 10 Nov 2024 20:02:27 +0900</pubDate> <docs>https://www.rssboard.org/rss-specification</docs> <item> <title>麻婆豆腐</title>