すみません、非同期読み込みが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 ) ;