www.mtkn.jp

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

commit 059c0b65063d1e024aa0e9a54052e1ee7075597f
parent 016ef388c9056d9a8057f6f9497647a726ac4f03
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Sat,  9 Nov 2024 21:29:20 +0900

update

Diffstat:
Mman/draft/9p.html | 42++++++++++++++++++++++++++++++++++++++++++
Mpub/draft/9p.html | 40++++++++++++++++++++++++++++++++++++++++
Mpub/rss.xml | 4++--
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(&quot;read size: %v&quot;, err) + } + if read != len(buf) { + return buf, fmt.Errorf(&quot;read size: invalid message.&quot;) + } + 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 &lt; int(size)-4; { + n, err := r.Read(mbuf[read:]) + if err != nil { + return buf, fmt.Errorf(&quot;read body: %v&quot;, 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(&quot;read size: %v&quot;, err) + } + if read != len(buf) { + return buf, fmt.Errorf(&quot;read size: invalid message.&quot;) + } + 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 &lt; int(size)-4; { + n, err := r.Read(mbuf[read:]) + if err != nil { + return buf, fmt.Errorf(&quot;read body: %v&quot;, 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>