UNIX版から開発しているから、次にWindowsで動かす時のデバッグに時間が掛かった。原因はFD_SETSIZE絡み。UNIXだとFD_SETSIZEのサイズは1024で以下のようにディスクリプタが振られた。
0…標準入力
1…標準出力
2…標準エラー出力
3…ソケットサーバー
4…クライアント1(telnet)
5…クライアント2(telnet)
この時点では数の少ないほうからディスクリプタが振られ1024には遠く及ばないので特に問題ではない。
これがWindowsだとコマンドプロンプトから起動した場合
1956…ソケットサーバー
1928…クライアント1(telnet)
1912…クライアント2(telnet)
直接実行ファイルをダブルクリックして起動した場合でも、
96…ソケットサーバー
124…クライアント1(telnet)
140…クライアント2(telnet)
といった感じで肝心のFD_SETSIZEは64で定義されている為、そのままでは役に立たないどころかオーバーフローを起こしてサーバーが落ちてしまっていた。結局Windowsの場合はFD_SETSIZEを2048に再定義するという方法で逃げた。正直ココまでばらついているとループ回数が増える分不利な気がする。
この時点でチョットの変更でFLASHクライアント用になれるチャットサーバーができました。サーバー自身はデータの中身について全く検査はしてないのとバッファは固定値なので大量にデータを送ると最大値以降の文字は削除されてしまうくらいです。
ソースのダウンロードはこちら(EUC)
socket_server_select