サンプルをいじって、簡素に1対1の通信に複数のネットハンドルを確立するようにしてみましたが、やはりといってはあれですが、うまく動きませんでした。
Q、W、Eを押したときに100,100に表示されるnet_Handle_がQの場合に256になるなどありえない状態になっています。
私の想定している動きとしては、そもそも一桁の数字しかやりとりしておらず、またQ、W、Eを押したときはnet_Handle_に数字が受け渡されることはないということです。 (コードは一番下に載せます)
そこで質問なのですが、
①一対の通信に複数のネットハンドルを確立することは可能なのでしょうか。
②できないのであれば、例えばチャットとゲーム操作を分けて送信する場合に最善の方法は何でしょうか。
(私が思いつくのは、状況によって送信・受信する関数を入れ替える方法ですが、少々煩雑そうです。チャットがないのであれば送信した変数の数字で判断できそうですが…)
を知りたいです。回答いただければ嬉しいです。
プログラミングのレベルは苦Cを読み終えた程度です。
//クライアント側処理//
void Network_Connect_Surver(int &ip_a, int &ip_b, int &ip_c, int &ip_d, int &i_port)
{
int *str_Buf , *str_Bufb;
int str_Buf_ , str_Bufb_;
str_Buf = &str_Buf_;
str_Bufb = &str_Bufb_;
IPDATA c_Ip;
int port;
int net_Handle , net_Handleb;
int data_Length , data_Lengthb;
//IPアドレス設定//
c_Ip.d1=ip_a;
c_Ip.d2=ip_b;
c_Ip.d3=ip_c;
c_Ip.d4=ip_d;
port = i_port;
int *address_test_Ip; //test_Ipを指し示すポインタ
int *address_test_Ip_; //test_Ip_bを指し示すポインタ
address_test_Ip = &test_Ip;
address_test_Ip_ = &test_Ip_b;
DrawFormatString(100,100,color_White,"通信待機中");
net_Handle = ConnectNetWork(c_Ip,port); //通信を確立
net_Handleb= ConnectNetWork(c_Ip,port);
if(net_Handle!=-1)
{
while(ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && Key_Flame()==0 &&Test_Ip()==0){
NetWorkSend(net_Handle,address_test_Ip,5);
NetWorkSend(net_Handleb,address_test_Ip_,5);
//データが来るまでループ
while(!ProcessMessage())
{
data_Length=GetNetWorkDataLength(net_Handle);
data_Lengthb=GetNetWorkDataLength(net_Handleb);
if(data_Length!=0)break;
if(data_Lengthb!=0)break;
}
NetWorkRecv(net_Handle,str_Buf,data_Length);
NetWorkRecv(net_Handleb,str_Bufb,data_Lengthb);
DrawFormatString(0,0,color_White,"%d",str_Buf_);
DrawFormatString(100,100,color_White,"%d",str_Bufb_);
}
}
}
//ホスト側処理//
void Network_Wait_Surver(int &i_port)
{
int *str_Buf , *str_Bufb;
int str_Buf_ , str_Bufb_;
str_Buf = &str_Buf_;
str_Bufb = &str_Bufb_;
IPDATA c_Ip,c_Ip_; //通信先IPアドレスデータ
int net_Handle , net_Handleb;
int data_Length , data_Lengthb;
int port=i_port;
int *address_test_Ip; //test_Ipを指し示すポインタ
int *address_test_Ip_; //test_Ip_bを指し示すポインタ
address_test_Ip = &test_Ip;
address_test_Ip_ = &test_Ip_b;
PreparationListenNetWork(port);
net_Handle=-1;
while(!ProcessMessage() && CheckHitKey(KEY_INPUT_ESCAPE)==0 &&ScreenFlip()==0)
{
DrawFormatString(100,100,color_White,"通信待機中");
net_Handle=GetNewAcceptNetWork();
net_Handleb=GetNewAcceptNetWork();
if(net_Handle!=-1)break;
}
if(net_Handle !=-1)
{
StopListenNetWork();
GetNetWorkIP(net_Handle,&c_Ip);
GetNetWorkIP(net_Handleb,&c_Ip_);
while(ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && Key_Flame()==0 &&Test_Ip()==0 )
{
NetWorkSend(net_Handle,address_test_Ip,5);
NetWorkSend(net_Handleb,address_test_Ip_,5);
while(!ProcessMessage())
{
if(GetNetWorkDataLength(net_Handle)!=0)break;
if(GetNetWorkDataLength(net_Handleb)!=0)break;
}
data_Length=GetNetWorkDataLength(net_Handle);
data_Lengthb=GetNetWorkDataLength(net_Handleb);
NetWorkRecv(net_Handle,str_Buf,data_Length);
NetWorkRecv(net_Handleb,str_Bufb,data_Lengthb);
DrawFormatString(0,0,color_White,"%d",str_Buf_);
DrawFormatString(100,100,color_White,"%d",str_Bufb_);
}
}
}
//送信する値をキー入力で決定する関数//
int Test_Ip(){
if(CheckHitKey(KEY_INPUT_Q)==1)
{test_Ip=1;}
if(CheckHitKey(KEY_INPUT_W)==1)
{test_Ip=2;}
if(CheckHitKey(KEY_INPUT_E)==1)
{test_Ip=3;}
if(CheckHitKey(KEY_INPUT_M)==1)
{test_Ip_b=4;}
if(CheckHitKey(KEY_INPUT_N)==1)
{test_Ip_b=5;}
if(CheckHitKey(KEY_INPUT_B)==1)
{test_Ip_b=6;}
return 0;
}