DxLibリファレンスの通信のプログラムを発展させたい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
史上最悪のデスペナ
記事: 521
登録日時: 15年前

DxLibリファレンスの通信のプログラムを発展させたい

#1

投稿記事 by 史上最悪のデスペナ » 14年前

いくら考えても分からなかったので教えてください。
DxLib本家のリファレンスConnectNetWorkのサンプルコードに

コード:

SetDoubleStartValidFlag( TRUE ); //二重起動許可
ChangeWindowMode(TRUE); //ウィンドウモード
を付け加えて、IPを「127.0.0.1」にして通信プログラムをPC内で行いました。
これを発展させて
受信側は常に受信を行って複数受信を可能にし、送信側は送信が終わって"繋がったぞ~!!"を受信したら自動で切れるようにしたいのです。
送信側は単純にWaitKey()を無くせばいいだけなのですが、受信側が分かりません。
(注:今回は同時接続の可能性を考えず、一人が接続終了したら次の人が接続を試みるものとします)

コード:

#include "DxLib.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
			LPSTR lpCmdLine, int nCmdShow )
{
	char StrBuf[ 256 ] ;		// データバッファ
	int NetHandle , LostHandle ;	// ネットワークハンドル
	int DataLength ;			// 受信データ量保存用変数
	IPDATA Ip ;			// 接続先IPアドレスデータ

	if( DxLib_Init() == -1 )	// DXライブラリ初期化処理
	{
		return -1;	// エラーが起きたら直ちに終了
	}

	// 接続してくるのを待つ状態にする
	PreparationListenNetWork( 9850 ) ;

	// 接続してくるかESCキーが押されるまでループ
	NetHandle = -1 ;
	while( !ProcessMessage() && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
	{
		// 新しい接続があったらそのネットワークハンドルを得る
		NetHandle = GetNewAcceptNetWork() ;

	        // 接続されていたら次に進む
	        if( NetHandle != -1 )
	        {
			// 接続してきたマシンのIPアドレスを得る
			GetNetWorkIP( NetHandle , &Ip ) ;

			// データが送られて来るまで待つ
			while( !ProcessMessage() )
			{
				// 取得していない受信データ量が0以外のときはループから抜ける
				if( GetNetWorkDataLength( NetHandle ) != 0 ) break ;
			}

			// データ受信
			DataLength = GetNetWorkDataLength( NetHandle ) ;	// データの量を取得
			NetWorkRecv( NetHandle , StrBuf , DataLength );	// データをバッファに取得

			// 受信したデータを描画
			DrawString( 0 , 0 , StrBuf , GetColor( 255 , 255 , 255 ) ) ;

			// 受信成功のデータを送信
			NetWorkSend( NetHandle , "繋がったぞ~!!" , 17 ) ;

		}
	}

	DxLib_End() ;	// DXライブラリ使用の終了処理

	return 0 ;	// ソフトの終了
}
としてみました
変更点://接続の受付を終了する StopListenNetWork() ;を削除
      ループ外のif( NetHandle != -1 )をループ内に入れた。
     // 相手が通信を切断するまで待つのループを削除

これで、出来るかなと思いましたが一人目は接続可能ですが二人目以降は接続が確立されないようです。
どこを直したらいいか教えてください

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: DxLibリファレンスの通信のプログラムを発展させたい

#2

投稿記事 by softya(ソフト屋) » 14年前

非常によろしくないプログラム構造をしているので状態遷移型に組み替えることをお勧めします。
問題点は、「相手が通信を切断するまで待つのループを削除」がマズイ気が・・・。

最後に素朴な疑問ですがサーバーもDXライブラリで作られるんでしょうか?
WinSockのコンソールアプリで十分な気がすると言うか無駄なリソースをDXライブラリに取られる気がします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

史上最悪のデスペナ
記事: 521
登録日時: 15年前

Re: DxLibリファレンスの通信のプログラムを発展させたい

#3

投稿記事 by 史上最悪のデスペナ » 14年前

softya(ソフト屋) さんが書きました:非常によろしくないプログラム構造をしているので状態遷移型に組み替えることをお勧めします。
問題点は、「相手が通信を切断するまで待つのループを削除」がマズイ気が・・・。
何でまずいのでしょう・・・・?まあ、そういうものだとして、状態遷移型ですか。調べてみます。
softya(ソフト屋) さんが書きました:サーバーもDXライブラリで作られるんでしょうか?
WinSockのコンソールアプリで十分な気がすると言うか無駄なリソースをDXライブラリに取られる気がします。
Winsock・・・・・・聞いたことはあるけどWin32APIが理解できないので、ましてや通信関係は理解できないだろうと忌避していました^^;
DxLibに通信関数があるからそれでいいか、と。こちらもちょっと調べてきます

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: DxLibリファレンスの通信のプログラムを発展させたい

#4

投稿記事 by softya(ソフト屋) » 14年前

史上最悪のデスペナ さんが書きました:
softya(ソフト屋) さんが書きました:非常によろしくないプログラム構造をしているので状態遷移型に組み替えることをお勧めします。
問題点は、「相手が通信を切断するまで待つのループを削除」がマズイ気が・・・。
何でまずいのでしょう・・・・?まあ、そういうものだとして、状態遷移型ですか。調べてみます。
これです。 ↓ 不適切な実装3. 
「補足資料.11章 書いてはいけない4つの処理」
http://dixq.net/g/h_11.html

状態遷移はタイトル処理などゲーム処理の基本処理です。
ゲームプログラミングの館にサンプルも幾つかあります。
「C言語~ゲームプログラミングの館~ 34. メイン関数の書き方。」
http://dixq.net/g/37.html

史上最悪のデスペナ さんが書きました:
softya(ソフト屋) さんが書きました:サーバーもDXライブラリで作られるんでしょうか?
WinSockのコンソールアプリで十分な気がすると言うか無駄なリソースをDXライブラリに取られる気がします。
Winsock・・・・・・聞いたことはあるけどWin32APIが理解できないので、ましてや通信関係は理解できないだろうと忌避していました^^;
DxLibに通信関数があるからそれでいいか、と。こちらもちょっと調べてきます
こっちは、これを。
「Geekなぺーじ:winsockプログラミング」
http://www.geekpage.jp/programming/winsock/
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: DxLibリファレンスの通信のプログラムを発展させたい

#5

投稿記事 by beatle » 14年前

MMORPGにするなら後々はサーバー機を用意すると思いますが,そのOSは何を使うかによって,現段階から使うライブラリは慎重に選んだほうがいいと思います.
Windows系は多人数が接続するサーバーとして使うには,サーバー専用のWindowsを買う必要があるかと思います.財力があればいいですが.
もしタダでサーバーを組みたいとするとLinuxでしょうが,LinuxでDXライブラリは動かないはずです.

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: DxLibリファレンスの通信のプログラムを発展させたい

#6

投稿記事 by softya(ソフト屋) » 14年前

Windows7だと20PC、WindowsVista/XPだと10PCが同時可能接続数の様です。
安価に、これ以上の同時接続数を狙うにはLinuxを使う必要があります。

【追記】ここのメンバーで参加者を募って同時接続テストをしたら軽くオーバーしそうな数字ではありますね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

史上最悪のデスペナ
記事: 521
登録日時: 15年前

Re: DxLibリファレンスの通信のプログラムを発展させたい

#7

投稿記事 by 史上最悪のデスペナ » 14年前

beatle さんが書きました:もしタダでサーバーを組みたいとするとLinuxでしょうが,LinuxでDXライブラリは動かないはずです.
そうなんですか・・・・・・・・・・・・・・・・っ!?何かの間違いだと願いたい・・・・・・・・・・。DirectX全然理解できないんですけど・・・・・・

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: DxLibリファレンスの通信のプログラムを発展させたい

#8

投稿記事 by softya(ソフト屋) » 14年前

史上最悪のデスペナ さんが書きました:
beatle さんが書きました:もしタダでサーバーを組みたいとするとLinuxでしょうが,LinuxでDXライブラリは動かないはずです.
そうなんですか・・・・・・・・・・・・・・・・っ!?何かの間違いだと願いたい・・・・・・・・・・。DirectX全然理解できないんですけど・・・・・・
LinuxでDirectXは動きません。OpenGLです。
と言うかサーバーで3D描画する必要は全くないと思います。コンソールで十分でしょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

史上最悪のデスペナ
記事: 521
登録日時: 15年前

Re: DxLibリファレンスの通信のプログラムを発展させたい

#9

投稿記事 by 史上最悪のデスペナ » 14年前

softya(ソフト屋) さんが書きました:LinuxでDirectXは動きません。OpenGLです。
と言うかサーバーで3D描画する必要は全くないと思います。コンソールで十分でしょう。
あ^^;そうでした。Client側の処理とごっちゃになっていたようです。ちょっと頭が煮詰まっているのかな?
この返信をするだけで10分ぐらいかけてるし・・・・・・書いては消し、書いては消し、そういえばこれはどうなんだろう、聞くほどのことじゃなかった、そういえば・・・今これ書かないって決めたじゃん・・・・・・みたいな事を繰り返してましたorz

ちょっと一旦プログラミングから離れます

閉鎖

“C言語何でも質問掲示板” へ戻る