VC++2008Expressでwin32appとwinsockの勉強の為にネットワークゲームを作ろうと思ってます。
winsockについて色々調べているうちに、疑問がわいたので質問します。
実現したいのは、サーバーとクライアントが1:Nのネットワークゲームです。
プレイヤーはサーバーに接続し、部屋に入ります。
誰かが初めて部屋に入ったら、サーバー側で部屋を用意します。(複数の部屋が立つこともあります)
サーバー側で用意された部屋は、タイマーのイベントで部屋の状況データが変ります。
また、部屋にいるプレイヤーがアクションを起こす度に、サーバーの状況データが変ります。
その状況データを部屋に居る1人以上のプレイヤーで参照し共有します。
またプレイヤーデータはサーバー側で全部を一括管理します。
このような、プログラムを作りたいと思ってるんですが、
例えばサーバー側でwinsockは待ちうけ(accept)の所でプログラムは止まってしまいますよね。
クライアント側では受信(recv)の所で止まりますよね。
サーバー側やクライアント側で通信を待ち受けながら、
タイマーやマウスクリックに対するイベント処理を同時に行うことは可能なんでしょうか。
出来るとしたら、どのような仕組みにする必要があるでしょうか。
よろしくお願いします。m(_ _)m
No.4
- 回答日時:
>自分のパソコンは7,8年前のPen4 2.0GHz Memory:768Mくらいの性能なので、
せめてメモリは積めるだけ積んだ方がいいかと思いますが。
>基本サーバ側1ソケットで待ちうけ、クライアント側は通信の度にソケットを作り、開放するということは現実的でしょうか?
可能でしょうけど、現実的ではないかと。
TCPの場合、接続のたびに3ウェイハンドシェークが発生することになります。
切断するときも正しく切断処理を行わないと、作成したソケットはドライバ内でしばらく保持されているやもしれません。
# netstatコマンドで状態が見れます。CLOSE_WAITとか…
TCPではなくUDPで作れば、いくらか軽くできるかも知れませんが……。
# 当然パケットロスとか、到達順が狂った場合とかの処理は自分でやることになりますが。
No.3
- 回答日時:
>ノンブロッキングモードだと同時に開けるソケットは何個までなんでしょうか?
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 個のスレッドを作成できます。」は
アプリケーションが使用できるメモリ空間のサイズ制限によるもの……でしょう。
まぁ、勉強用に作ったゲームでそんなに接続数が増えることも無いでしょうし、その前に別の部分で問題になる…でしょう。
# ルータ側の制限だったり、ホスト側のマシン性能だったり…。
詳しい回答ありがとうございます。
自分のパソコンは7,8年前のPen4 2.0GHz Memory:768Mくらいの性能なので、
DDNSでサーバーとしてこのパソコンを公開して、サーバープログラムを走らせながら、
同時にこのパソコンで日常の作業を行うとなると、あまり負荷のかかることは出来ないかもしれません。
その場合、クライアントの数だけソケットを確立するのではなく、
基本サーバ側1ソケットで待ちうけ、クライアント側は通信の度にソケットを作り、開放するということは現実的でしょうか?
No.2ベストアンサー
- 回答日時:
ノンブロッキングモードに変更する必要があるかも知れません。
WSAAsyncSelect()などを使用することになるかと。
ブロッキングモードだとそれぞれのsocketで「送信専用」「受信専用」にスレッドを起こす必要があるかと。
ユーザー操作の結果を受け取るためにrecv()していた場合、データ受信するまでの間はソコで停止します。
他のユーザー操作や状態変化をユーザーに送信しようとしてもそのスレッドはrecv()で止まっていますからsend()できません。
# ユーザー側から一定間隔でなんらかのデータ送信するようにしていれば…recv()で受信待ちのままになる…ということは防げるかも知れませんが。
UDPだった場合は…別ですかね。
# UDP使ったプログラム作ったことありませんので…。
この回答への補足
追伸。。。
ノンブロッキングモードだと同時に開けるソケットは何個までなんでしょうか?
プレイヤーが例えば2000人居る場合、2000人ソケットつなぎっぱなしとか可能なのでしょうか?
詳しい解説ありがとうございます。
winsockの解説HPを見ていたらブロックとか同期とかスレッドとか色々な形態があるようですね。
ノンブロッキングモードというのを調べてみたいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- サーバー 接続・ログインはできているのにメールが送信できない 2 2022/06/27 15:03
- サーバー メールサーバーについて詳しい方、メールサーバーの管理業務経験のある方、教えてください。 3 2022/11/12 18:24
- サーバー Webサイト構築フリーランスの案件受注について 1 2022/03/27 18:16
- サーバー Googleドライブなどを使わずにテザリングAndroidでWindowsとファイル共有 1 2023/02/19 13:14
- サーバー ネットワークの構成に困っています 3 2023/07/05 11:55
- UNIX・Linux サーバー間のデータコピー(データ形式とデーターフォーマットの変換あり。一定間隔で処理) 2 2023/08/22 22:15
- Gmail SPFレコードとDNSサーバーについて、gmailを設定できるかどうか 2 2023/06/10 23:55
- お酒・アルコール 居酒屋のお酒の作り方で質問です。 サーバーの樽ハイ倶楽部(プレーン)120mlとシロップ30mlをい 3 2023/06/07 09:56
- その他(セキュリティ) 役所など、情報系システムのセキュリティが弱くても業務システムに問題ないか 3 2022/11/02 16:38
- ネットワーク 社内ネットワークの1台だけ接続できないときがある 4 2023/01/25 11:58
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
UDP通信におけるbind関数について
-
ソケットを用いた1対多通信につ...
-
ソケットのrecvの戻り値が0
-
Socket通信の0バイト受信について
-
同じLAN内パソコンのIPアドレス...
-
SIPがNATを越えられない理由
-
recv関数でフリーズしてしまう
-
相手のIPアドレスを取得する方法
-
Winsockで接続待ちタイムアウト...
-
JavaによるXMLの送受信
-
VB6のwinsockでconnectできない
-
エクセル VBA でのCOMポート...
-
ソケット通信 同じポート番号...
-
Socket通信を待ち受け状態にす...
-
送信したデータの一部が文字化...
-
ネットワークプログラミングに...
-
メッセージを受信したら受信終...
-
UDPで受信スループットを測定
-
winsockでファイル転送
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
UDP通信におけるbind関数について
-
Winsockで接続待ちタイムアウト...
-
recv関数でフリーズしてしまう
-
VB6のwinsockでconnectできない
-
ソケットのクローズについて
-
UDP通信する時に、相手にどうや...
-
エクセル VBA でのCOMポート...
-
ソケットのrecvの戻り値が0
-
UdpClient 送信元のIPアドレ...
-
Socket通信の0バイト受信について
-
WinSockでの通信プログラムがう...
-
同じLAN内パソコンのIPアドレス...
-
ソケット通信 同じポート番号...
-
VC++でのソケット通信について
-
Connectエラーが出てしまう・・...
-
CreateFile関数でCOMポートが開...
-
Winsockを使わずにVBでSocketを...
-
VB6‥ソケットについて
-
SIPがNATを越えられない理由
おすすめ情報