トップページ > 過去ログ > 記事閲覧
通信関係について
名前:タカラベ 日時: 2011/08/19 13:15

ネットワーク対戦のできるゲームを作ろうと思い、通信関係の関数を利用してプログラムを書き、できた実行プログラムを用いてローカルネットワークでつながれた2台のPCを使い実際に動かしてみました。 一方のPC(マシンA)からもう一方のPC(マシンB)への接続は成功しましたが、マシンBからマシンAへの接続には失敗しました。どちらも同条件の環境で、同じプログラムを使用しております。 また、接続の確立後にNetWorkSendを利用してデータの送信を試みたのですが、データが上手く送信されませんでした。受信側のプログラムも問題ないと思うのですが…。自分なりに原因を調べてみたところ、接続後にマシンAに返されるネットワークハンドルと、GetNewAcceptNetWorkを利用してマシンBに返されるネットワークハンドルが違っていました。これは仕様なのでしょうか? ご回答よろしくお願いします。

Page: 1 |

Re: 通信関係について ( No.1 )
名前:Will 日時:2011/08/19 15:29

ソースがないので文章から判る範囲で回答します。 > 一方のPC(マシンA)からもう一方のPC(マシンB)への接続は成功しましたが、マシンBからマシンAへの接続には失敗しました。 説明が不十分で的はずれな回答になるかもしれませんが、B→A接続失敗はA→Bが接続している状況で行っているのでしょうか? そうであるならば、A→Bへ接続した時に使用したポート以外のポートを使用しなければなりません。 そうではなくて、AとBが接続されていない状況でB→Aへの接続の時だけ失敗するということであれば 今の情報からではわかりません。 > データが上手く送信されませんでした。 「上手くいかない」では答えられません。 例えば「ABCDという文字列を送信してみたが、受信側ではABしか受信できなかった。」というふうに 「期待する動作」と「実際の動作」を詳細に書いてください。 > GetNewAcceptNetWorkを利用してマシンBに返されるネットワークハンドルが違っていました。これは仕様なのでしょうか? ハンドルはPC固有で割り振られるものです。 よって、異なることに何の問題もありません。
Re: 通信関係について ( No.2 )
名前:タカラベ 日時:2011/08/19 21:19

申し訳ありません、ソースの提示を行っていませんでした。 関係のない部分の表記は削っています。 int mine_network_handle = -1; // 接続側マシンに返されるネットワークハンドル int other_network_handle = -1; // 被接続側マシンに返されるネットワークハンドル int other_user_num = 0; // 送信したいデータの値 IPDATA ip; // IPアドレス void ClientProcess(void){ // 接続を試みる側の処理 if(message_connection_flg[0] == 1 && message_connection_flg[1] == 1 && message_connection_flg[2] == 0){ // 接続するための条件を満たしているかを判別します // IPの値の入力はすでに完了しているものとします mine_network_handle = ConnectNetWork(ip,59642); if(mine_network_handle != -1) connection_flg = 1; // 接続が成功すればフラグを立てて次のステップへと進みます else if(mine_network_handle == -1){ error_flg = 1; error_connection = 1; message_connection_flg[2] = 1; } // 接続が失敗すればエラーメッセージを表示します } } void GameMain(void){ // 接続成功後に行う処理 // 接続待ち側の処理 ----------------------------------------------------------------- if(network_type == 1){ mine_usernum = 0; if(game_close_flg == 0) PreparationListenNetWork(59642); else if(game_close_flg == 1) StopListenNetWork(); if(other_network_handle == -1) other_network_handle = GetNewAcceptNetWork(); if(other_network_handle != -1){ other_usernum = i + 1; NetWorkSend(other_network_handle,&other_usernum,15); } } // 接続を行った側の処理 ------------------------------------------------------------- else if(network_type == 2){ client_data_quant = GetNetWorkDataLength(mine_network_handle); if(client_data_quant != 0) NetWorkRecv(mine_network_handle,&client_data_buf,client_data_quant); if(client_data_buf >= 0 && client_data_buf < 1000){ mine_usernum = client_data_buf; client_data_buf = -1; } } } >B→A接続失敗はA→Bが接続している状況で行っているのでしょうか? AとBが接続されていない状況でB→Aの接続に失敗します。 >ハンドルはPC固有で割り振られるものです。 >よって、異なることに何の問題もありません。 把握しました。ありがとうございます。
Re: 通信関係について ( No.3 )
名前:いっち 日時:2011/08/19 22:55

「21.チャットプログラム基本」を実行した結果はどのようになりますか? > h t t p ://homepage2.nifty.com/natupaji/DxLib/dxprogram.html#N21 どちらのPCをサーバーとしても、クライアントとしても動作するでしょうか?
Re: 通信関係について ( No.4 )
名前:タカラベ 日時:2011/08/20 15:00

はい、どちらでも接続に成功しました。
Re: 通信関係について ( No.5 )
名前:タカラベ 日時:2011/08/20 15:24

申し訳ありません!自己解決しました。 数値を1か所打ち間違えていただけでした…。 ご回答くださった方々、ありがとうございます。

Page: 1 |