'//サーバーのクローズ
Private Sub CloseServer()
listener.Stop()
listener = Nothing
この2行を入れて
Private Sub ServerListen()
If server Is Nothing Then
Return
End If
この処理の頭で listenerが無い場合は強制的に排除したら
良いと思われます。
コーヒーブレイクさんのコードでも良いと思いますが、上のコードだとエラーが
報告されません。
英文のnetworkstream.endreadのページにbeginreadの説明がありますが、
callback method executes in a separate thread and is called by the system after BeginRead returns
とあります。
スレッドのハッシュコードを調べましたが、呼び出し元と違うスレッドでした。
コールバックメソッドという名前なので元のスレッドに戻るような
印象を受けますが、元ではなく別のスレッドだと思います。
サイトの図ではコールバックをサーバー用スレッド上に書かれてましたが、
誤解を招くのではないでしょうか。