commit 575bc6cd845f4aa234e6d23afedd8820b228576e
parent 059c0b65063d1e024aa0e9a54052e1ee7075597f
Author: Matsuda Kenji <info@mtkn.jp>
Date: Sun, 10 Nov 2024 20:23:49 +0900
update
Diffstat:
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 <T>, new<T>([]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 <T>, new<T>([]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>