- ベストアンサー
VC++2008Expressでwin32appとwinsockの勉強
- VC++2008Expressでwin32appとwinsockの勉強をしています。ネットワークゲームを作成するために、winsockについて調査中です。
- サーバーとクライアントが1:Nのネットワークゲームを実現したいです。部屋の用意や状況データの共有が重要です。
- VC++2008Expressでのプログラム作成中には、通信待ちと同時にイベント処理を行う方法について検討中です。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
ノンブロッキングモードに変更する必要があるかも知れません。 WSAAsyncSelect()などを使用することになるかと。 ブロッキングモードだとそれぞれのsocketで「送信専用」「受信専用」にスレッドを起こす必要があるかと。 ユーザー操作の結果を受け取るためにrecv()していた場合、データ受信するまでの間はソコで停止します。 他のユーザー操作や状態変化をユーザーに送信しようとしてもそのスレッドはrecv()で止まっていますからsend()できません。 # ユーザー側から一定間隔でなんらかのデータ送信するようにしていれば…recv()で受信待ちのままになる…ということは防げるかも知れませんが。 UDPだった場合は…別ですかね。 # UDP使ったプログラム作ったことありませんので…。
その他の回答 (3)
- Wr5
- ベストアンサー率53% (2173/4061)
>自分のパソコンは7,8年前のPen4 2.0GHz Memory:768Mくらいの性能なので、 せめてメモリは積めるだけ積んだ方がいいかと思いますが。 >基本サーバ側1ソケットで待ちうけ、クライアント側は通信の度にソケットを作り、開放するということは現実的でしょうか? 可能でしょうけど、現実的ではないかと。 TCPの場合、接続のたびに3ウェイハンドシェークが発生することになります。 切断するときも正しく切断処理を行わないと、作成したソケットはドライバ内でしばらく保持されているやもしれません。 # netstatコマンドで状態が見れます。CLOSE_WAITとか… TCPではなくUDPで作れば、いくらか軽くできるかも知れませんが……。 # 当然パケットロスとか、到達順が狂った場合とかの処理は自分でやることになりますが。
お礼
TCPでクライアントの数だけソケットを作る方向で作ってみます。 メモリ増設も考えたいと思います。ありがとうございました。
- Wr5
- ベストアンサー率53% (2173/4061)
>ノンブロッキングモードだと同時に開けるソケットは何個までなんでしょうか? http://www.kt.rim.or.jp/~ksk/wskfaq-ja/advanced.html#maxsockets メモリ容量に左右される…っぽいです。 http://support.microsoft.com/kb/111855/ja こちらはMSサイトから。(ただし対象になるOSが古いですな) WSAStartup(MAKEWORD(1, 1), &wsaDat); で実行したら0x7fffでした。(WindowsXP Pro SP3) >プレイヤーが例えば2000人居る場合、2000人ソケットつなぎっぱなしとか可能なのでしょうか? おそらく可能でしょう。 http://www.kt.rim.or.jp/~ksk/wskfaq-ja/advanced.html#64sockets には注意が必要かも知れませんが。 # 私の場合、せいぜい3コネクション程度なので、64ソケットの確認はしていませんが。 1ソケットを1スレッドで……ということになる場合、ソケット数より作成できるスレッド数に問題が出てくるかと。 http://okwave.jp/qa/q1115491.html の回答で書かれている「各スレッドに 1MB のスタック空間が割り当てられています。そのため、最大 2,028 個のスレッドを作成できます。」は アプリケーションが使用できるメモリ空間のサイズ制限によるもの……でしょう。 まぁ、勉強用に作ったゲームでそんなに接続数が増えることも無いでしょうし、その前に別の部分で問題になる…でしょう。 # ルータ側の制限だったり、ホスト側のマシン性能だったり…。
お礼
詳しい回答ありがとうございます。 自分のパソコンは7,8年前のPen4 2.0GHz Memory:768Mくらいの性能なので、 DDNSでサーバーとしてこのパソコンを公開して、サーバープログラムを走らせながら、 同時にこのパソコンで日常の作業を行うとなると、あまり負荷のかかることは出来ないかもしれません。 その場合、クライアントの数だけソケットを確立するのではなく、 基本サーバ側1ソケットで待ちうけ、クライアント側は通信の度にソケットを作り、開放するということは現実的でしょうか?
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
スレッドを起こせばいいんじゃない?
お礼
回答ありがとうございます。 スレッドですね、調べてみたいと思います。
お礼
詳しい解説ありがとうございます。 winsockの解説HPを見ていたらブロックとか同期とかスレッドとか色々な形態があるようですね。 ノンブロッキングモードというのを調べてみたいと思います。
補足
追伸。。。 ノンブロッキングモードだと同時に開けるソケットは何個までなんでしょうか? プレイヤーが例えば2000人居る場合、2000人ソケットつなぎっぱなしとか可能なのでしょうか?