プロが教えるわが家の防犯対策術!

VC++2008Expressでwin32appとwinsockの勉強の為にネットワークゲームを作ろうと思ってます。
winsockについて色々調べているうちに、疑問がわいたので質問します。

実現したいのは、サーバーとクライアントが1:Nのネットワークゲームです。
プレイヤーはサーバーに接続し、部屋に入ります。
誰かが初めて部屋に入ったら、サーバー側で部屋を用意します。(複数の部屋が立つこともあります)
サーバー側で用意された部屋は、タイマーのイベントで部屋の状況データが変ります。
また、部屋にいるプレイヤーがアクションを起こす度に、サーバーの状況データが変ります。
その状況データを部屋に居る1人以上のプレイヤーで参照し共有します。
またプレイヤーデータはサーバー側で全部を一括管理します。
このような、プログラムを作りたいと思ってるんですが、
例えばサーバー側でwinsockは待ちうけ(accept)の所でプログラムは止まってしまいますよね。
クライアント側では受信(recv)の所で止まりますよね。
サーバー側やクライアント側で通信を待ち受けながら、
タイマーやマウスクリックに対するイベント処理を同時に行うことは可能なんでしょうか。
出来るとしたら、どのような仕組みにする必要があるでしょうか。

よろしくお願いします。m(_ _)m

A 回答 (4件)

>自分のパソコンは7,8年前のPen4 2.0GHz Memory:768Mくらいの性能なので、



せめてメモリは積めるだけ積んだ方がいいかと思いますが。

>基本サーバ側1ソケットで待ちうけ、クライアント側は通信の度にソケットを作り、開放するということは現実的でしょうか?

可能でしょうけど、現実的ではないかと。
TCPの場合、接続のたびに3ウェイハンドシェークが発生することになります。
切断するときも正しく切断処理を行わないと、作成したソケットはドライバ内でしばらく保持されているやもしれません。
# netstatコマンドで状態が見れます。CLOSE_WAITとか…

TCPではなくUDPで作れば、いくらか軽くできるかも知れませんが……。
# 当然パケットロスとか、到達順が狂った場合とかの処理は自分でやることになりますが。
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/05/17 11:57

>ノンブロッキングモードだと同時に開けるソケットは何個までなんでしょうか?



http://www.kt.rim.or.jp/~ksk/wskfaq-ja/advanced. …
メモリ容量に左右される…っぽいです。

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. …
には注意が必要かも知れませんが。
# 私の場合、せいぜい3コネクション程度なので、64ソケットの確認はしていませんが。

1ソケットを1スレッドで……ということになる場合、ソケット数より作成できるスレッド数に問題が出てくるかと。
http://oshiete.goo.ne.jp/qa/1115491.html
の回答で書かれている「各スレッドに 1MB のスタック空間が割り当てられています。そのため、最大 2,028 個のスレッドを作成できます。」は
アプリケーションが使用できるメモリ空間のサイズ制限によるもの……でしょう。

まぁ、勉強用に作ったゲームでそんなに接続数が増えることも無いでしょうし、その前に別の部分で問題になる…でしょう。
# ルータ側の制限だったり、ホスト側のマシン性能だったり…。
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/05/16 15:33

ノンブロッキングモードに変更する必要があるかも知れません。


WSAAsyncSelect()などを使用することになるかと。

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

UDPだった場合は…別ですかね。
# UDP使ったプログラム作ったことありませんので…。

この回答への補足

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

補足日時:2010/05/16 13:35
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/05/16 13:00

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

    • good
    • 0
この回答へのお礼

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

お礼日時:2010/05/16 03:11

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!