>>管理人さん
なるほど、通信環境などによって程度の差はあれ
遅延は起こり得るもので、UDPにしても信頼性は下がるので
それに対する対策を講じる必要があるということですね。
>>いっちさん
以下のような形でデータの送受信を行っています。
メイン部分については、後は初期設定と終了設定、変数の定義、画像ハンドルのロード程度しか行っていません。
CurrentPositions関数ではx座標の計算を行い、構造体に格納しています。
検証には送られてきたデータと送ったデータを
fprintfでファイルに書き込んで、値がどのようになっているかを検証しました。
煩雑なプログラムで大変申し訳ないのですが、
不自然な点や問題がありそうな点があればご指摘いただきたく思います。
よろしくお願いいたします。
********************************メイン部分の送受信の関数を呼び出してる部分************************************
c_state = NetWorkConnect(network);
if(c_state == 1){
///////////////////////////クライアント///////////////////////////////
while( ProcessMessage()==0 && ClearDrawScreen()==0 && CheckHitKey( KEY_INPUT_ESCAPE )!=1){
ReceiveCurrentData(&pos);
// 描画先を指定する
SetDrawScreen( DX_SCREEN_BACK ) ;
// 画面をクリア
ClearDrawScreen() ;
DrawGraph( pos.x,0, GraphHandle , TRUE ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
// 新たに切断されたネットワークハンドルを得る
LostHandle = GetLostNetWork() ;
// 切断された接続が今まで通信してた相手だった場合ループを抜ける
if( LostHandle == NetHandle[0] ) break ;
}
}
else if(c_state==2){
//////////////////////////////サーバー///////////////////////////////
while( ProcessMessage()==0 && ClearDrawScreen()==0 && CheckHitKey( KEY_INPUT_ESCAPE )!=1){
CurrentPositions(motionT,&pos);
SendCurrentData(&pos);
// 描画先を指定する
SetDrawScreen( DX_SCREEN_BACK ) ;
// 画面をクリア
ClearDrawScreen() ;
DrawGraph( pos.x,0, GraphHandle , TRUE ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
// 新たに切断されたネットワークハンドルを得る
LostHandle = GetLostNetWork() ;
// 切断された接続が今まで通信してた相手だった場合ループを抜ける
if( LostHandle == NetHandle[0] ) break ;
}
}
if(c_state==1){
NetWorkConnect(N_LOST);
}
// 接続を断つ
if(c_state==2){
NetWorkConnect(N_CLOSE);
}
*********************************************************************************************************
***********************************ネットワーク通信の接続確立部分*********************************************
int NetWorkConnect(int mode){
char StrBuf[ 256 ] ; // データバッファ
int DataLength ; // 受信データ量保存用変数
int i=0;
int counter=0;
int ipCounter=0;
int now;
IPDATA Ip[10] ; // 接続先IPアドレスデータ
if(mode==SERVER){
//////-- 接続待ち側プログラム--//////
DrawString( 0 , 16 , "サーバーだよ" , GetColor( 255 , 255 , 255 ) ) ;
// 接続してくるのを待つ状態にする
PreparationListenNetWork( 9850 ) ;
for(i=0;i<10;i++){
// 接続してくるかESCキーが押されるまでループ
NetHandle[i] = -1 ;
}
i=0;
while( !ProcessMessage() && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
// 新しい接続があったらそのネットワークハンドルを得る
NetHandle[i] = GetNewAcceptNetWork() ;
if(NetHandle[i]!=-1)
{
i++;
counter=0;
}
counter++;
WaitTimer(1);
if((counter>15000 && NetHandle[0]!=-1) || i>10)
{
break ;
}
}
// 接続されていたら次に進む
if( NetHandle[0] != -1 )
{
// 接続の受付を終了する
StopListenNetWork() ;
for(i=0;i<10;i++){
if(NetHandle[i]==-1) break;
// 接続してきたマシンのIPアドレスを得る
GetNetWorkIP( NetHandle[i] , &Ip[i] ) ;
}
i=0;
while(i<10 || NetHandle[i]!=-1){
NetWorkSend( NetHandle[i] , "繋がったか〜!?" , 17 ) ;
i++;
}
// データがくるのを待つ
while( !ProcessMessage() )
{
// 取得していない受信データ量を得る
DataLength = GetNetWorkDataLength( NetHandle[0] ) ;
// 取得してない受信データ量が0じゃない場合はループを抜ける
if( DataLength != 0 ) break ;
}
// データ受信
NetWorkRecv( NetHandle[0] , StrBuf , DataLength ) ; // データをバッファに取得
// 受信したデータを描画
DrawString( 0 , 0 , StrBuf , GetColor( 255 , 255 , 255 ) ) ;
return 2;
}
}
else if(mode==CLIENT){
//////-- 接続側プログラム--//////
DrawString( 0 , 16 , "クライアントだよ" , GetColor( 255 , 255 , 255 ) ) ;
// IPアドレスを設定( ここにある4つのIP値は仮です )
Ip[0].d1 = 192 ;
Ip[0].d2 = 168 ;
Ip[0].d3 = 11 ;
Ip[0].d4 = 0 ;
while(!ProcessMessage() && (CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )){
// 通信を確立
NetHandle[0] = ConnectNetWork( Ip[0], 9850 ) ;
if( NetHandle[0]>=0 ) break;
Ip[0].d4++;
if(Ip[0].d4==256)break;
}
// 確立が成功した場合のみ中の処理をする
if( NetHandle[0] != -1 )
{
// データが送られて来るまで待つ
while( !ProcessMessage() )
{
// 取得していない受信データ量を得る
DataLength = GetNetWorkDataLength( NetHandle[0] ) ;
// 取得してない受信データ量が0じゃない場合はループを抜ける
if( DataLength != 0 ) break ;
}
// データ受信
NetWorkRecv( NetHandle[0] , StrBuf , DataLength ); // データをバッファに取得
// 受信したデータを描画
DrawString( 0 , 0 , StrBuf , GetColor( 255 , 255 , 255 ) ) ;
// 受信成功のデータを送信
NetWorkSend( NetHandle[0] , "繋がったぞ〜!!" , 17 ) ;
return 1;
}
}
if(mode==N_CLOSE){
i=0;
while(NetHandle[i]!=-1){
CloseNetWork( NetHandle[i] ) ;
i++;
}
}
else if(mode=N_LOST){
// 切断確認表示
DrawString( 0 , 16 , "切断しました" , GetColor( 255 , 255 , 255 ) ) ;
}
return -1;
}
*********************************************************************************************************
**************************************データの送受信の関数************************************************
void SendCurrentData(Posdata *pPos)
{
int i;
char senddata[1024];
sprintf(senddata,"%f",pPos->x);
i=0;
while(i<10 && NetHandle[i] != -1){
NetWorkSend( NetHandle[i] , senddata , lstrlen(senddata)+1 );
i++;
}
}
void ReceiveCurrentData(Posdata *pPos)
{
int DataLength2=0;
char recdata[1024];
// 取得していない受信データ量が0以外のときはループから抜ける
if( GetNetWorkDataLength( NetHandle[0] ) != 0 ){
// データ受信
DataLength2 = GetNetWorkDataLength( NetHandle[0] ) ; // データの量を取得
}
// 取得してない受信データ量が0じゃない場合
if( DataLength2 != 0 ) {
// データ受信
NetWorkRecv( NetHandle[0] , recdata , DataLength2 ) ; // データをバッファに取得
pPos->x=(float)atof(recdata);
}
DataLength2=0;
}
*********************************************************************************************************