[DXライブラリ]UDP通信について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
たなかたろう

[DXライブラリ]UDP通信について

#1

投稿記事 by たなかたろう » 12年前

初めまして、たなかたろうと申します。初質問です。
今DXライブラリで1対1の通信対戦のアクションゲームを作っております。
それぞれほぼ同じコードを使って弾と自分の位置を相手に送信し合うという方法で通信しているのですが、通信の関数を作る途中でつまずいてしまいました。

OSはwindows xpでコンパイラはVisualC++ 2008 Express Editionです。
通信方法としてDXライブラリのUDP通信の関数(http://homepage2.nifty.com/natupaji/DxL ... html#R13N1)を使用し、
1m以内のlanで通信するのでバイナリデータ化せずに通信しております。

コード:

#include "DxLib.h"
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
             LPSTR lpCmdLine, int nCmdShow )
{
    IPDATA Ip ; 
    int NetUDPHandle ;
    int x1=100,y1=300;  //自分の座標
    int x2=300,y2=100;  //相手の座標
  int go[2];  //送信用配列
    int come[2];  //受信用配列
 
    if( DxLib_Init() == -1 )    // DXライブラリ初期化処理
    {
         return -1; // エラーが起きたら直ちに終了
    }
 
    NetUDPHandle = MakeUDPSocket( -1 ) ;
 
    Ip.d1 = *** ;  //IPアドレスは具体的に入力していません
    Ip.d2 = *** ;
    Ip.d3 = *** ;
    Ip.d4 = *** ;
    
    while(ProcessMassage()==0)
    {
         //移動などの処理がここに入ります
        
         //送信部分(怪しいところ)
    go[0]=x1;
         go[1]=y1;
         NetWorkSendUDP( NetUDPHandle, Ip, 9850, go, 8 ) ;

         //受信部分(わからないところ)
    if(CheckNetWorkRecvUDP(nethandle)==TRUE)
         {
              NetRecvUDP(nethandle,NULL,NULL,come,8,FALSE);
              x2=come[0];
              y2=come[1];
          }
    }
    DeleteUDPSocket( NetUDPHandle ) ; 
 
    DxLib_End() ;   // DXライブラリ使用の終了処理
 
    return 0 ;
}
このコードはおそらく間違っているのですが、どこが間違っているか具体的に教えてください。お願いします!

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: [DXライブラリ]UDP通信について

#2

投稿記事 by みけCAT » 12年前

両方のマシンで同じ提示されたコードを使用すると仮定すると、

コード:

MakeUDPSocket( -1 ) ;
の部分が間違っていると思います。

コード:

MakeUDPSocket( 9850 ) ;
にした方が良くないですか?

でも、「ほぼ同じコード」と書いてあるということは、同じコードではないということですか?
でしたら、もう一方のコードも提示してください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: [DXライブラリ]UDP通信について

#3

投稿記事 by みけCAT » 12年前

go,comeの大きさを決めうちしているのも良くないと思います。
sizeofを使ってください。
たなかたろう さんが書きました:1m以内のlanで通信するのでバイナリデータ化せずに通信しております。
int型配列の時点でバイナリデータだと思います。
LANの中身は知っているかもしれませんが、LAN内ということだけでは、int型のサイズやエンディアンが同じマシンばかりとは言えません。
(int型のサイズはコンパイルの段階で固定されるかも)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: [DXライブラリ]UDP通信について

#4

投稿記事 by みけCAT » 12年前

コード:

if(CheckNetWorkRecvUDP(nethandle)==TRUE)
も怪しいと思います。

コード:

int cnwr_ret=CheckNetWorkRecvUDP(nethandle);
if(cnwr_ret && cnwr_ret!=-1)
とした方が確実だと思います。

というか、nethandleはどこ(か)で定義/宣言されていますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

たなかたろう

Re: [DXライブラリ]UDP通信について

#5

投稿記事 by たなかたろう » 12年前

おっしゃられた通り

コード:

MakeUDPSocket( -1 ) ;

コード:

MakeUDPSocket( 9850 ) ;
に変えたら正しく動きました。本当にありがとうございます。

ちなみに「ほぼ同じコード」というのは代入する座標がX1からX2にかえただけのコードです。

閉鎖

“C言語何でも質問掲示板” へ戻る