commit 059c0b65063d1e024aa0e9a54052e1ee7075597f
parent 016ef388c9056d9a8057f6f9497647a726ac4f03
Author: Matsuda Kenji <info@mtkn.jp>
Date: Sat, 9 Nov 2024 21:29:20 +0900
update
Diffstat:
3 files changed, 84 insertions(+), 2 deletions(-)
diff --git a/man/draft/9p.html b/man/draft/9p.html
@@ -488,3 +488,45 @@ size[4] Rwstat tag[2]
</p>
<h2>Goによる実装</h2>
+<h3>メッセージの構造体の定義</h3>
+<h3>メッセージのやりとり</h3>
+<p>
+まずは9Pメッセージを読む関数を実装する。\
+バイト列が読めればいいので引数は<code>io.Reader</code>にした:
+</p>
+<pre><code>\
+func readMsg(r io.Reader) ([]byte, error) {
+</code></pre>
+<p>
+最初にメッセージのサイズを読む:
+</p>
+<pre><code> buf := make([]byte, 4)
+ read, err := r.Read(buf)
+ if err != nil {
+ if err == io.EOF {
+ return nil, err
+ }
+ return nil, fmt.Errorf("read size: %v", err)
+ }
+ if read != len(buf) {
+ return buf, fmt.Errorf("read size: invalid message.")
+ }
+ size := bufMsg(buf).Size()
+</code></pre>
+<p>
+続いて読みこんだサイズに基づいてメッセージの残りの部分を読む。
+一回の<code>Read</code>で最後まで読めないことがあったので、
+全部読めるまで<code>Read</code>を繰り返す:
+</p>
+<pre><code> mbuf := make([]byte, size-4)
+ for read = 0; read < int(size)-4; {
+ n, err := r.Read(mbuf[read:])
+ if err != nil {
+ return buf, fmt.Errorf("read body: %v", err)
+ }
+ read += n
+ }
+ buf = append(buf, mbuf...)
+ return buf, nil
+}
+</code></pre>
diff --git a/pub/draft/9p.html b/pub/draft/9p.html
@@ -309,6 +309,46 @@ size[4] Rwstat tag[2]
<code>stat</code>はファイルの属性を読む。読めた情報は<code>stat</code>として返される。<code>wstat</code>はファイルの属性を<code>stat</code>に変更する。<code>stat</code>はファイルの名前や<code>qid</code>、サイズ、作成日、更新日等の情報がバイト列になったものである。</p>
<h2>Goによる実装</h2>
+<h3>メッセージの構造体の定義</h3>
+<h3>メッセージのやりとり</h3>
+<p>
+まずは9Pメッセージを読む関数を実装する。バイト列が読めればいいので引数は<code>io.Reader</code>にした:
+</p>
+<pre><code>func readMsg(r io.Reader) ([]byte, error) {
+</code></pre>
+<p>
+最初にメッセージのサイズを読む:
+</p>
+<pre><code> buf := make([]byte, 4)
+ read, err := r.Read(buf)
+ if err != nil {
+ if err == io.EOF {
+ return nil, err
+ }
+ return nil, fmt.Errorf("read size: %v", err)
+ }
+ if read != len(buf) {
+ return buf, fmt.Errorf("read size: invalid message.")
+ }
+ size := bufMsg(buf).Size()
+</code></pre>
+<p>
+続いて読みこんだサイズに基づいてメッセージの残りの部分を読む。
+一回の<code>Read</code>で最後まで読めないことがあったので、
+全部読めるまで<code>Read</code>を繰り返す:
+</p>
+<pre><code> mbuf := make([]byte, size-4)
+ for read = 0; read < int(size)-4; {
+ n, err := r.Read(mbuf[read:])
+ if err != nil {
+ return buf, fmt.Errorf("read body: %v", err)
+ }
+ read += n
+ }
+ buf = append(buf, mbuf...)
+ return buf, nil
+}
+</code></pre>
</article>
</main>
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>Tue, 5 Nov 2024 21:02:53 +0900</lastBuildDate>
-<pubDate>Tue, 5 Nov 2024 21:02:53 +0900</pubDate>
+<lastBuildDate>Sat, 9 Nov 2024 21:28:44 +0900</lastBuildDate>
+<pubDate>Sat, 9 Nov 2024 21:28:44 +0900</pubDate>
<docs>https://www.rssboard.org/rss-specification</docs>
<item>
<title>麻婆豆腐</title>