やれやれと思ったら

Pocket

パッチを送ってみたのですがどうやらうまくない様子。
マルチキャストのほうは、bindするときにsin_addr.s_addr=INADDR_ANYでないと関数が成功しないというものです。でも、そうすると複数のマルチキャストアドレス扱えないらしく、さてどうしようということになりました。
調べてみたけど、いい方法がないので、マルチキャストアドレスでbindが失敗したとき、INADDR_ANYを使うことにしました。
-net socket,connectの方は、もっと難しくて、非同期モードでconnectしたとき、Linux上では、EINPROGRESSなのに、Windows上ではWSAEWOULDBLOCKになってしまうというものです。
Linuxでは、EWOULDBLOCKは、EAGINと同じなためもう1度connectを実行するのですが、WindowsだとWSAEINVALIDになって、パラメータが違っていることになってしまうのです。
いろいろ調べてみたのですが、なんかいい方法がないのです。
そこで、Windows上でBSDソケットを使うことはあきらめて、イベントを使うことにしました。
WSACreateEventして、WSAEventSelectして、WSAWaitForMultibleEventsで待つのですが、サーバーがダウンしていてもFD_CONNECTのシグナルが来ていることがわかり、なんでサーバーなして接続するんだ???でした。
結局、こちらでiErrorCode[FD_CONNECT_BIT]を調べればいいことがわかり、なんとか接続の完了を調べられることがわかりました。
http://forums.belution.com/ja/vc/000/206/45s.shtml
それにしても、なんて面倒なんだか。これでいいのかな。

Pocket