TCPに引き続き、UDPを作ってみた。
https://github.com/shigenobu/OrangeCabinet
一応、nugetに公開済みです。
これも、JAVA版があるのですが。。一応紹介。
https://github.com/shigenobu/blueshelf
一応、mavenで公開済みです。
この、C#のUDPライブラリの特徴は、以下となります。
- 例によって、ハーフクローズを検知用に、最終受信からN秒でタイムアウト(UDPはそんなもんないけど)を処理
- クライアントでもbindする
一番目は、送信元が同じ限り、タイムアウトするまでは独自のオブジェクトで任意変数を格納できる。
(セッションみたいなイメージ)
二番目は、クライアントでも予めbindすることで、ポートを決め打ちできる。
connectだと、ポートが決め打ちできないので、あえてbindを使う形にしています。
なんでこんなもんをつくっているのかというと、
実は、TCP/UDPのサーバ機能を必要とするあるものを作りたいと考えているからです。
うまくできたら、nugetに公開しようかと考えています。
今回ちょっとハマったのは、BeginXXXとEndXXXは対になっているらしく、
BeginReceiveFrom
と
EndReceiveFrom
はセットで使う必要があるということでした。
ただ、BeginReceiveFromの部分でも、使わないremote endpointインスタンスを生成しないといけないのは、ちょっと微妙な気がした。
完了時に、remote endpointが取れればいいと思うのだが。。
また、システムコールとしては、epoll_createは使われていたが、UDPなんでepollである必要もないのかなとは思った。
JAVAだと、UDPに対するepollの実装はないので(正確にはJAVA7でお蔵入りしたようだが)。
概ね問題なさそうだが、一時オブジェクトの生成が少し多い気がしている。
IAsyncResultオブジェクトを毎回作っているような感じなので、そこは調整できればとは思う。
(ただ、毎回作らないと受信バッファの読み込みがうまくいかないので、簡単にはいかない気がしている。)
以上