現在下記の構造体をwinsockで送信しようとしています。
サーバーとクライアントを同一PCで立ち上げて、送受信した際は問題なくクライアントで受け取れたのですが
LANで繋がれた別PCで実験してみたところ、データが受け取れませんでした。
良くわからなかったので、char szResult[1024*5];を→char szResult[1024];とバイト数を減らしたところ無事に受信できました
同一PCだと受け取れて、LANで繋がれたPCだと受け取れないのはなぜでしょうか??
その時に使用していたコードを記します。単純にsendとrecvを行っていただけです。
//送信データの入った構造体
SQLRESULT Result;
//省略
//送信側
nRet = send(s,(char *)&Result,sizeof(SQLRESULT),0);
//受信するための構造体
SQLRESULT RecvResult;
//受信側
nRet = recv(s,(char *)&RecvResult,sizeof(SQLRESULT),0)
そこで、自分で調べてみて、以下の様にコードを書き直して見ました
//送信側
int server::senddata(WPARAM wParam){
int i,nRet,nSendSize = 0;
int dwSize; //送信するバイト数
char *lptr; //構造体の先頭アドレスを格納するポインタ
dwSize = sizeof(SQLRESULT);//送信バイト数の計算
lptr = (char *)&Result; //構造体の先頭アドレスを代入
for(i = 0;i < nConnectCount;++i){
if((SOCKET)wParam == MemData[i].s){
while(nSendSize <= sizeof(SQLRESULT)){
nRet = send(MemData[i].s,lptr,dwSize,0);
dwSize -= nRet;//送信したバイト数を減算
lptr += nRet; //送信した分だけポインタを進める
nSendSize += nRet;
if(nRet == SOCKET_ERROR)
return -1;
}
}
}
return 0;
};
//受信側
int client::rcvData(){
int nRcv = 0;
char *recvptr = (char *)&Result;//ポインタの代入
int nRcvSize = 0;
int dwSize;
while(nRcvSize <= sizeof(SQLRESULT)){
nRcv = recv(s,(char *)recvptr,sizeof(SQLRESULT),0);
nRcvSize += nRcv; //受信バイト数を貯蓄
recvptr += nRcv; //受信した分ポインタを進める
if(nRcv == SOCKET_ERROR)
return -1;
}
return 0;
}
かなり不安が残るので、添削できる方が居たら、是非お願いいたします。
また、同一PCだと問題なく通信できて、LAN環境に出ると受信できなくなる理由を教えてください。お願いいたします。