ただし、connect ができない。Listen 側しかできないけどちゃんと全二重通信。
とりあえずサーバが作りたかったからまぁ問題ないでしょう。
結構複雑そうに見えたけど、実際に実装してみると意外とすんなりと実装できたTCP。
実作業時間5〜6時間程度。
とりあえず分かったこと。
- シーケンス番号は、番号ではなくバイト数だった。
- だから未受信の最も古いポインタを示す ACK。
- SYN,FIN はシーケンス番号を1つ消費する。
- だから実際の転送バイト数と1Byteずれる。
- Windows の送信してくるパケットはチェックサムがおかしい。
- マシン(LANボード)が死にかかってる前兆かな…
送信・受信バッファは普通に考えるとリングバッファだろうと考えて実装してみた。
パケットの届く順番が入れ替わることがあるので、オフセット指定付きの
ちょっと変則的なリングバッファを作ることになった。
あとスレッド使いすぎなのは設計が悪いせいだな。
受信を下層からの PUSH 型にしようとしたのがそもそもの間違いなのかもしれない。
けど、これはこれで流れが分かりやすくて個人的には好み。
次はなんちゃってWebサーバでも実装してみようかな。