【C++】DXライブラリによる、TCP通信にて【ポート開放】

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
りうう
記事: 4
登録日時: 10年前

【C++】DXライブラリによる、TCP通信にて【ポート開放】

#1

投稿記事 by りうう » 10年前

こんにちは。りううと申します。

私は、DXライブラリのTCP通信を用いて接続の確認をしようと思いまして、プログラムを組んでみたのですが、
ほかのパソコンからの接続を確認できません。

自分のパソコンからの接続は確認しております。

また、ポート開放についてなのですが、某オンラインゲームのサーバーのポート開放などはできるのですが、
自分が作ったものはポート開放がうまくいきません。

ソースは、http://homepage2.nifty.com/natupaji/DxL ... html#R13N1こちらを参考にさせていただきました。

接続側
KeyInput(テキストボックスのようなもの)にIPアドレスを入力し、'.'ごとに分けIPアドレスとして変換し接続しています。

コード:

TCHAR buf[15] = "";
						  GetKeyInputString(buf, network.inputhandle);
						  vector<string> ips = split(buf, '.');
						  network.Ip.d1 = atoi(ips.at(0).c_str());
						  network.Ip.d2 = atoi(ips.at(1).c_str());
						  network.Ip.d3 = atoi(ips.at(2).c_str());
						  network.Ip.d4 = atoi(ips.at(3).c_str());
						  DeleteKeyInput(network.inputhandle);
						  network.NetHandle = ConnectNetWork(network.Ip, PORT);    //PORT = ポート番号
						  if (network.NetHandle != -1){
							  NetWorkSend(network.NetHandle, p, sizeof(Player));    //ホストに必要データを送信
							  network.connect = true;    //接続には関係ない処理
							  network.nb.active = false;
						  }
						  else{    //接続に失敗した場合、もう一度入力できるようにする
							  network.inputhandle = MakeKeyInput(15, FALSE, FALSE, FALSE);
						  }
受信側

コード:


//①一回だけする処理
PreparationListenNetWork(PORT);

//②繰り返しする処理
void NetWork_Recieve(){
	if (nhandle < 4){
		int nethandle = GetNewAcceptNetWork();    //コンピュータの接続を取得
		if (nethandle != -1){   //接続されていたら
			NetHandles[nhandle] = nethandle;   //ネットワークハンドルを保存
			GetNetWorkIP(NetHandles[nhandle], &Ips[nhandle]);    //接続先のIPを取得

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

			NetWorkRecv(NetHandles[nhandle], &players[nhandle],sizeof(Player));   //必要データの受け取り

			nhandle++;
			ps++;
		}
	}
    //切断されたときの処理(ここは無視しても良いかと思われます。
	int lost = GetLostNetWork();
	if (lost != -1){
		for (int i = 0; i < 4; i++){
			if (NetHandles[i] == lost){
				if (i == 3){
					NetHandles[i] = -1;
					Ips[i] = IPDATA();
				}
				else{
					for (int j = i; j < 4; j++){
						NetHandles[j] = NetHandles[j + 1];
						Ips[j] = Ips[j + 1];
					}
				}
				ps--;
			}
		}
	}
}

ソースコードがスパゲッティになっていたり、通信にまったく関係のない処理が接続や受信部分に混じっているので、
大変ややこしい表記になってしまい申し訳ございません。
ソースコードは、すべて載せるのがマナーかと思いますが、少しでも混乱をさけるためにこのような処置をしました。

送信側は、コメントに書いてあるとおり 入力したIPアドレスに接続をするものとなっております。
受信側は、①が一回だけ呼び出され、②が外部にある(このソースコードには載っていない)終了条件が真になるまで繰り返されるものと
なっております。

自分のパソコンでの接続は確認できました。(ポート開放がいらないからと思われます。
他人のパソコンからの接続は確認できませんでした。(ポート開放ができてないからかと思われます。
ほかの方が作ったオンラインゲームのポート開放は成功してあります。(確認サイトで確認済み。
自分が作ったもの(上記のコードを使ってあるもの)のポート開放は失敗してしまいます。(確認サイトで確認済み。

ずらずらと長文を書いてしまいましたが、要は「自分が作ったアプリだとポート開放がうまくいかない。」ということです。

ポート番号の変更などいろいろ試してみましたが、通信関係には初めて手をつけるので、見落としている点があるかもしれません。
よろしければ、ご教示ください。


アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: 【C++】DXライブラリによる、TCP通信にて【ポート開放】

#2

投稿記事 by h2so5 » 10年前

もう少し詳しい情報が必要だと思います。

・他人のパソコンというのはローカルネットワーク内か、それともインターネット越しか
・確認サイトからではなく、「他人のパソコン」からはオンラインゲームに接続できるのか
・オンラインゲームと同じポートを使用した場合に他人のパソコンから接続できるのか
・ポート開放はどのような方法で行っているか
・ファイアウォールの設定は確認したかどうか

ちなみに、ポート開放は基本的にルーター側の設定の問題であってアプリケーションには関係がないので、DXライブラリ側のコードが原因でポート開放そのものが失敗するということはありません。

りうう
記事: 4
登録日時: 10年前

Re: 【C++】DXライブラリによる、TCP通信にて【ポート開放】

#3

投稿記事 by りうう » 10年前

>h2so5 さん

お早い返信どうもありがとうございます。
結論から先に言いますと、ほかのコンピュータからの接続を確認できました。
まだ、自分の家にある別のパソコン(ローカルネットワーク内?)からの接続しか試していませんが。

>ちなみに、ポート開放は基本的にルーター側の設定の問題であってアプリケーションには関係がないので、DXライブラリ側のコードが原因でポート開放そのものが失敗するということは
 ありません。

関係は無かったのですね。勘違いしていました。教えてくださってありがとうございます。

>もう少し詳しい情報が必要だと思います。

すみません、的外れな情報ばかり記述していましたね。

接続ができなかった原因は、ファイアーウォールの設定が不十分だったことでした。

ファイアウォールについては ちんぷんかんぷん なのですが、
http://www.akakagemaru.info/port/windows7fwport.html
こちらを参考にさせてもらい、設定をしてみたところ無事接続を確認できました。

改めて、お早い返信と的確なアドバイスどうもありがとうございました!
とても助かりました。
今後このようなことがありましたら、もうすこし自分で調べる努力をしてみます。

閉鎖

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