TCPでWinsockを用いてサーバークライアントを構築しています。
一定数以上の接続は拒否してクライアント側にエラーコードを通知したいのですが上手くいきません。
明示的に、クライアントから来ているコネクション要求を破棄して、クライアント側にエラー通知を出すことは可能でしょうか?
サーバー側accept関数
////////////////////////////////////////////////////////////////////////
//接続許可を出す関数
//戻り値:int
////////////////////////////////////////////////////////////////////////
BOOL server::connectaccept(){
SetCurret();
char *lpStr;
if(nConnectCount == DlgNetOption::nMaxConnect){
lpStr = CastTimeStr("これ以上接続できません\r\n");
SendMessage(hEdit,EM_REPLACESEL,1,(LPARAM)lpStr);
accept(listen_s,NULL,0); //ブロッキング回避の読み捨て
return false;
}else{
nFromlen = sizeof(SOCKADDR_IN);
for(i = 0;i <= DlgNetOption::nMaxConnect;++i){
if(MemData[i].nId == 0){
MemData[i].nId = i+1;
MemData[i].s = accept(listen_s,(sockaddr *)&MemData[i].from,&nFromlen);
if(MemData[i].s == INVALID_SOCKET){
lpStr = CastTimeStr("接続ソケット生成エラー\r\n");
SendMessage(hEdit,EM_REPLACESEL,1,(LPARAM)lpStr);
return false;
}else{
++nConnectCount;
wsprintf(szOutBuff,"%s",inet_ntoa(MemData[i].from.sin_addr));
wsprintf(szInfoBuff,"%sが接続してきました\r\n",szOutBuff);
lpStr = CastTimeStr(szInfoBuff);
SendMessage(hEdit,EM_REPLACESEL,1,(LPARAM)lpStr);
wsprintf(szInfoBuff,"接続台数:%d",nConnectCount);
SendMessage(hStatus,SB_SETTEXT,0,(LPARAM)szInfoBuff);
return false;
}
}
}
}
return true;
}
///////////////////////////////////////////////////////////////////
//FD_CONNECT
//
///////////////////////////////////////////////////////////////////
int client::Connect(LPARAM lParam){
int nError;
char szDebug[256];
nError = WSAGETSELECTERROR(lParam);
wsprintf(szDebug,"%d",nError);
MessageBox(NULL,szDebug,"",MB_OK);
if(WSAGETSELECTERROR(lParam) != 0){ //Connect関数のエラーコードを取得コレ重要 戻り値が0以外だとエラー
MessageBox(NULL,"サーバーが見つかりません。設定を確認してください","エラー",MB_OK);
SendMessage(hStatus,SB_SETTEXT,0,(LPARAM)"接続待機中");
client::SockFlag = FALSE;
return -1;
}else{
SendMessage(hStatus,SB_SETTEXT,0,(LPARAM)"サーバー接続中");
client::SockFlag = true;
}
return 0;
}
クライアント側ではWSAGETLASTERRORでもエラーコードが拾えず、クライアント側では接続が確立されている。と勘違いしてしまいます。
こういったシステムを作るときはエコーバックサーバーとしてやんわり断ってあげるのが正当なのでしょうか・・・・?
強制的に断る方法はもちろん、設計含め、ご教授ください。