言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

たくさんのソケットで待ち受けるとどうなるか。

毎日実装の些細な部分ばかりやってると、ああ、こういう仕事って自分じゃなくても出来るんじゃないか、何故こんな事を今やっているんだとやるせない反面。明確なゴールのある事というのはパズルとして単純に面白くもある。

さてソケット。Squeak でのソケットはまだライブラリとして成熟途上にあって(一昨年ぐらいに非互換の変更があった)、未だにユーザがゴリゴリ原始的な部分を書く場合も多く地雷源になっている。最近 Croquet のコードをじっくり読んでいて、使いもしないソケットやスレッドを大量に生成して放置という事を繰り返すのに気づくのだが、何故かそれなりにデモが出来る程度には動いているのを見て、ちゃんとソケットの動作を確認してみようと思った。

調べた事は単純な事で、

  • TCP では、同じポートを同時に監視する事は出来ない。
  • UDP では、同じポートを同時に監視する事が出来る(同じ結果が返される)。

ややこしいのは、TCP の同じポートを監視するソケットを二つ作れてしまう事。二つ作っても実際に待ち受ける事が出来るのは先に作った方だけだ。これはエラーにしてくれた方が良かったのに。。。既に他の人にポートを取られてしまっていた場合の検出方法が良く分からない。

UDP の場合は無保証投げっぱなしだから、こういう動作で良いのだろう。でもランダムに到着するデータをどのようにして二つのソケットに平等に返しているのかは不思議だ。