• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VC++2008Expressでwin32appとwinsockの勉強)

VC++2008Expressでwin32appとwinsockの勉強

このQ&Aのポイント
  • VC++2008Expressでwin32appとwinsockの勉強をしています。ネットワークゲームを作成するために、winsockについて調査中です。
  • サーバーとクライアントが1:Nのネットワークゲームを実現したいです。部屋の用意や状況データの共有が重要です。
  • VC++2008Expressでのプログラム作成中には、通信待ちと同時にイベント処理を行う方法について検討中です。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.2

ノンブロッキングモードに変更する必要があるかも知れません。 WSAAsyncSelect()などを使用することになるかと。 ブロッキングモードだとそれぞれのsocketで「送信専用」「受信専用」にスレッドを起こす必要があるかと。 ユーザー操作の結果を受け取るためにrecv()していた場合、データ受信するまでの間はソコで停止します。 他のユーザー操作や状態変化をユーザーに送信しようとしてもそのスレッドはrecv()で止まっていますからsend()できません。 # ユーザー側から一定間隔でなんらかのデータ送信するようにしていれば…recv()で受信待ちのままになる…ということは防げるかも知れませんが。 UDPだった場合は…別ですかね。 # UDP使ったプログラム作ったことありませんので…。

MenPin
質問者

お礼

詳しい解説ありがとうございます。 winsockの解説HPを見ていたらブロックとか同期とかスレッドとか色々な形態があるようですね。 ノンブロッキングモードというのを調べてみたいと思います。

MenPin
質問者

補足

追伸。。。 ノンブロッキングモードだと同時に開けるソケットは何個までなんでしょうか? プレイヤーが例えば2000人居る場合、2000人ソケットつなぎっぱなしとか可能なのでしょうか?

その他の回答 (3)

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.4

>自分のパソコンは7,8年前のPen4 2.0GHz Memory:768Mくらいの性能なので、 せめてメモリは積めるだけ積んだ方がいいかと思いますが。 >基本サーバ側1ソケットで待ちうけ、クライアント側は通信の度にソケットを作り、開放するということは現実的でしょうか? 可能でしょうけど、現実的ではないかと。 TCPの場合、接続のたびに3ウェイハンドシェークが発生することになります。 切断するときも正しく切断処理を行わないと、作成したソケットはドライバ内でしばらく保持されているやもしれません。 # netstatコマンドで状態が見れます。CLOSE_WAITとか… TCPではなくUDPで作れば、いくらか軽くできるかも知れませんが……。 # 当然パケットロスとか、到達順が狂った場合とかの処理は自分でやることになりますが。

MenPin
質問者

お礼

TCPでクライアントの数だけソケットを作る方向で作ってみます。 メモリ増設も考えたいと思います。ありがとうございました。

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.3

>ノンブロッキングモードだと同時に開けるソケットは何個までなんでしょうか? 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 個のスレッドを作成できます。」は アプリケーションが使用できるメモリ空間のサイズ制限によるもの……でしょう。 まぁ、勉強用に作ったゲームでそんなに接続数が増えることも無いでしょうし、その前に別の部分で問題になる…でしょう。 # ルータ側の制限だったり、ホスト側のマシン性能だったり…。

MenPin
質問者

お礼

詳しい回答ありがとうございます。 自分のパソコンは7,8年前のPen4 2.0GHz Memory:768Mくらいの性能なので、 DDNSでサーバーとしてこのパソコンを公開して、サーバープログラムを走らせながら、 同時にこのパソコンで日常の作業を行うとなると、あまり負荷のかかることは出来ないかもしれません。 その場合、クライアントの数だけソケットを確立するのではなく、 基本サーバ側1ソケットで待ちうけ、クライアント側は通信の度にソケットを作り、開放するということは現実的でしょうか?

回答No.1

スレッドを起こせばいいんじゃない?

MenPin
質問者

お礼

回答ありがとうございます。 スレッドですね、調べてみたいと思います。

関連するQ&A

専門家に質問してみよう