サーバ側まだ作ってないので動作未確認ですが。。。
#include "DxLib.h"
#define FONTHIGNT 16
#define TIMEOUT (10*1000) //10秒
#define SMT_CHAR 0x00000001
typedef struct {
int Type;//パケットのタイプ
int Size;//パケットのサイズ(このヘッダを含む)
}PK_HEADER;
typedef struct {
PK_HEADER hdr;
char name[16];
int hp, mhp;
int mp, mmp;
}CHAR_DATA;
int GetPacketHeader( int NetHandle, PK_HEADER* pheader, int timeout );
int GetPacketData( int NetHandle, void* Data, int Size, int timeout );
int GetCharDataPacket( int NetHandle, CHAR_DATA* pData );
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int Ret;
char StrBuf[ 256 ] ;
IPDATA Ip ; // 接続用IPアドレスデータ
int NetHandle ; // ネットワークハンドル
CHAR_DATA MyChar;
memset( &MyChar, 0, sizeof(MyChar));
ChangeWindowMode( TRUE );
SetDoubleStartValidFlag( TRUE );
if( DxLib_Init() == -1 ){ return -1; }
Ip.d1 = 192, Ip.d2 = 168, Ip.d3 = 1, Ip.d4 = 2;
// 通信を確立
NetHandle = ConnectNetWork( Ip ) ;
if( NetHandle < 0 ){
MessageBox( NULL, "通信の確立に失敗しました", NULL, MB_OK );
goto Exit;
}
//キャラ情報取得
Ret = GetCharDataPacket( NetHandle, &MyChar );
if ( Ret < 0 ){
sprintf( StrBuf,"キャラクタ情報の取得に失敗しました:Ret(%d)", Ret );
MessageBox( NULL, StrBuf, NULL, MB_OK );
goto Release;
}
while( !ProcessMessage() && !CheckHitKey(KEY_INPUT_ESCAPE) ){
sprintf( StrBuf,"キャラクタデータ Name:%s HP:%d/%d MP:%d/%d", MyChar.name, MyChar.hp, MyChar.mhp, MyChar.mp, MyChar.mmp );
DrawString( 0 , FONTHIGNT*10 , StrBuf , GetColor( 255 , 255 , 255 ) );
}
Release:
CloseNetWork( NetHandle );
Exit:
DxLib_End();
return 0 ; // ソフトの終了
}
int GetCharDataPacket( int NetHandle, CHAR_DATA* pData )
{
int FuncRet;
CHAR_DATA chr;
FuncRet = GetPacketHeader( NetHandle, &chr.hdr, (TIMEOUT/2));//ヘッダ情報取得
if ( FuncRet < 0 ){ return -1;}
if ( chr.hdr.Type != SMT_CHAR ){ return -2; }//キャラデータ以外無視
FuncRet = GetPacketData( NetHandle,(void*)&chr, chr.hdr.Size,(TIMEOUT/2));//キャラデータ取得
if ( FuncRet < 0 ){ return -3; }
memcpy( pData, &chr, sizeof(CHAR_DATA));
return 0;
}
//データのタイプとサイズを先行して取得(通信バッファには残す)
int GetPacketHeader( int NetHandle, PK_HEADER* pheader, int timeout )
{
int DataLength, RecvRet;
int Timer = GetNowCount();
if( pheader == NULL ){ return -1; }
while( !ProcessMessage() ){
if ((GetNowCount() - Timer) >= timeout ){ return -2; }
DataLength = GetNetWorkDataLength(NetHandle);
if ( DataLength >= sizeof(PK_HEADER) ){
RecvRet = NetWorkRecvToPeek( NetHandle, pheader, sizeof(PK_HEADER));
if ( RecvRet < 0 ){ return -3; }
break;
}
}
return 0;
}
//実データの取得
int GetPacketData( int NetHandle, void* Data, int Size, int timeout )
{
int DataLength, RecvRet;
int Timer = GetNowCount();
if ( Data == NULL ){ return -1; }
while( !ProcessMessage() ){
if ((GetNowCount() - Timer) >= timeout ){ return -2; }
DataLength = GetNetWorkDataLength(NetHandle);
if ( DataLength >= Size ){
RecvRet = NetWorkRecv( NetHandle, Data, Size );
if ( RecvRet < 0 ){ return -3; }
break;
}
}
return 0;
}
行数稼ぐためにすこし見辛いですが
タイムアウトまでは受信バッファが溜まるのを待ちます。
溜まれば取得って感じです。
タイプとサイズは調べるために先行で取得し、
欲しいタイプと違えばそのまま無視しても受信バッファに残ります。