トップページ > 記事閲覧
非同期読み込みをオンにしたままUDP通信が出来ない?
名前:ycy 日時: 2016/05/02 17:45

いつも有り難くライブラリを使わせて頂いています。 非同期読み込みのフラグがTRUEの状態でNetWorkSendUDPの戻り値が0や-1になってしまいます。 また、その状態で受信側にデータは届きませんでした。(エラーなので当然ですが…) 非同期読み込みフラグをFALSEに戻してから関数を呼び出すと問題ないようです。 バージョンはVC用3.16b、IDEはVS2013Expressです。 /* 再現コード */ #include <DxLib.h> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { ChangeWindowMode(TRUE); SetGraphMode(800, 600, 32); if (DxLib_Init() < 0) return -1; // ソケットを作成 int hdl = MakeUDPSocket(7500); IPDATA ip; ip.d1 = 127; ip.d2 = 0; ip.d3 = 0; ip.d4 = 1; // バッファを作成 BYTE buffer[32]; ZeroMemory(buffer, sizeof(buffer)); size_t size = sizeof(buffer); SetUseASyncLoadFlag(FALSE); bool asyncFlag = true; int time = GetNowCount(); for (;;){ if (ProcessMessage() != 0) break; // 500ミリ秒で非同期読み込みのフラグを切り替え if (GetNowCount() - time > 500){ asyncFlag = !asyncFlag; SetUseASyncLoadFlag(asyncFlag); time = GetNowCount(); } // 非同期読み込みをTRUEにすると-1や0が帰ってくる int result = NetWorkSendUDP(hdl, ip, 7000, buffer, size); SetDrawScreen(DX_SCREEN_BACK); ClearDrawScreen(); TCHAR buf[32]; swprintf_s(buf, L"result : %d", result); DrawString(0, 0, buf, 0xFF0000); ScreenFlip(); } DxLib_End(); return 0; } /* ここまで */ よろしくお願いします。
メンテ

Page: 1 |

Re: 非同期読み込みをオンにしたままUDP通信が出来ない? ( No.1 )
名前:管理人 日時:2016/05/05 18:15

すみません、非同期読み込みがONの状態では NetWorkSendUDP と NetWorkRecvUDP が 正常に動作しないようになっていました 修正版をアップしましたので、よろしければお試しください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_DevCppTest.exe // Dev-C++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) ただ、こちらのバージョンを使用しても載せていただいたプログラムは正常に動作しません 実は NetWorkSendUDP と NetWorkRecvUDP は非同期処理に対応していて、SetUseASyncLoadFlag( TRUE ) ; の状態で実行した場合と、SetUseASyncLoadFlag( FALSE ) ; の状態で実行した場合とでは挙動が異なります ( NetWorkSend と NetWorkRecv も同様です ) SetUseASyncLoadFlag( TRUE ) ; の状態で NetWorkSendUDP や NetWorkRecvUDP を実行すると実際の 通信処理は別のスレッドで行われるため、関数の戻り値はエラーを示す -1 か、正常終了を示す 0 かの どちらかになります なので、本来の戻り値である「通信したデータのサイズ」を取得するには非同期処理の結果を取得するための 関数 GetHandleASyncLoadResult を使用します 流れとしては   1.NetWorkSendUDP( 又は NetWorkRecvUDP ) を呼ぶ   2.CheckHandleASyncLoad( ネットワークハンドル ) の戻り値が FALSE になる( 処理が完了する )のを待つ   3.GetHandleASyncLoadResult( ネットワークハンドル ) で関数の戻り値を取得する となります 載せていただいたプログラムを上記のような処理に変更してみましたので、よろしければご覧ください m(_ _)m #include <DxLib.h> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { ChangeWindowMode(TRUE); SetGraphMode(800, 600, 32); if (DxLib_Init() < 0) return -1; // ソケットを作成 int hdl = MakeUDPSocket(7500); IPDATA ip; ip.d1 = 127; ip.d2 = 0; ip.d3 = 0; ip.d4 = 1; // バッファを作成 BYTE buffer[32]; ZeroMemory(buffer, sizeof(buffer)); size_t size = sizeof(buffer); SetUseASyncLoadFlag(TRUE); int phase = 0; int result = 0; for (;;){ if (ProcessMessage() != 0) break; switch( phase ) { case 0: NetWorkSendUDP(hdl, ip, 7000, buffer, size); phase = 1; break; case 1: if( CheckHandleASyncLoad( hdl ) == FALSE ) { result = GetHandleASyncLoadResult( hdl ); phase = 0; } break; } SetDrawScreen(DX_SCREEN_BACK); ClearDrawScreen(); TCHAR buf[32]; swprintf_s(buf, L"result : %d", result); DrawString(0, 0, buf, 0xFF0000); ScreenFlip(); } DxLib_End(); return 0; } 最初のフレームで NetWorkSendUDP を実行して、次のフレームでは CheckHandleASyncLoad で処理の完了を チェックして、処理が完了していたら GetHandleASyncLoadResult で関数の戻り値を取得する、という流れです 尚、もし NetWorkSendUDP の処理に非同期処理を使用したくないという場合は NetWorkSendUDP を呼ぶ前に SetUseASyncLoadFlag( FALSE ) ; を呼ぶようにしてください m(_ _)m SetUseASyncLoadFlag( FALSE ) ; result = NetWorkSendUDP(hdl, ip, 7000, buffer, size); SetUseASyncLoadFlag( TRUE ) ;
メンテ
Re: 非同期読み込みをオンにしたままUDP通信が出来ない? ( No.2 )
名前:ycy(解決) 日時:2016/05/07 14:44

ご返答、ご対応ありがとうございます。 実は非同期処理に対応していたのですね。 リソース関係のみだと思っていました…。 UDP通信の非同期処理のサンプルコードもありがとうございました。 参考にさせて頂きます。 これで解決とさせていただきます。 改めてありがとうございました。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存