|
왕대박 님이 쓰신 글 :
: 이채호 님이 쓰신 글 :
: : 죄송하게도 제가 사용을 ICS위주로 하다 보니 정확한 답변을 못 드립니다만 문제는 아시는대로 연결 문제입니다.
: :
: : 즉 상호 연결 체크 부분을 체크하시면 될겁니다.
: :
: : 만약 빠져있다면 추가하셔야합니다.
: :
: : 속성중에 prepared라는 부분이 있을것 같은데 체크해보시길~
:
: 우선, 답신을 주셔서 감사합니다.
: indy에서 prepared속성이 어떤걸 말씀하시는지 잘모르겠습니다. ???
:
: ///////////////////
: 그냥.. 제 생각에는
: 요~~ 메시지는 client연결상태가 임의적으로~ 강제적으로 바뀐것을 서버단에서 알아채지 못한체로~
: TCP/IP가 ack신호를 기다리다가 기다리다가~ 지쳐서 내보내는 메시지 인것 같은데...--;;;
: 즉, indy TCP Server에서 FD_*** 계열의 메시지를 서브클래싱해서
: 해당 메시지를 모른체~ 해버리면 될 것 같은데... T.T;;;
:
: indy의 TCP Server 컨포턴트가 winproc 도 없고~ 그렇다고, handle도 없고~
: 해서~ Winproc을 오버~~ 할수도, SetWindowLong함수를 사용할 수도 없는 상태입니다.
: 그렇다면 이것도 답이 아닌가????
:
: 음... 님께서 말씀하신 방법이 어떤 것인지 조금만 더 자세히 알려주시면 어떨까요??
: 부탁드립니다. 아~~ 오늘까지 끝내야하는데.. 이제 오금이 저려옵니다. 그려...
에러나는 부분이 수신대기열이더군요.
여기에 예외처리를 붙이고~
Client Connection Thread를 날려버렸더니.. 해결되었습니다.
제가 생각한 바를 조금 더 설명을 하자면~
indy가 거의 완전하게 소켓을 뒤집어싸가지는 구조를 가지고 있기때문에
내부까지의 접근은 어렵고~ 재정의 또한 이래저래 어렵습니다.
아시는 분은 다 아시다 싶이 논리적으로 접속지향성의 TCP/IP의 구조적인 문제로 인해
Client가 물리적으로 연결이 끊어져버린 경우~
알아낼 방법은 주기적으로 패킷을 주고/받을 수 밖에 없습니다.
이미 물리적으로 끊긴 connection에 논리적으로 작업을 걸어야 에러가 날 수 밖에...
이러한 둘 사이의 차이점을 똑똑한 윈도우가 알아채고는 메시지를 보내줍니다.
이 메시지를 받기위해 indy에서 발생하는 메시지를 가로체려고 했어나,
내공이 딸려서인지 할 수 없었고... (실제로 FD_**** 류의 메시지가
어차피~ "꽝"인 내용인지라~ 쓰레드를 통해서 데이터를 기다리는 대기열 파트에 에러처리를 씌워서~
논리적인 connection을 날려버리면 어떨까하고 했더니 되었습니다.
제가 상상한 방법이 정확한지는 저도 모릅니다. --;;;
이렇게 했더니.. 되긴 되더군요...
답변주신 님 감사합니다. 꾸벅~~
void __fastcall TfrmMain::TCPServerExecute(TIdPeerThread *AThread)
{
String CMD;
String RevMsg;
int nlsID;
FCommModule* m_pRev;
try {
Application->ProcessMessages();
RevMsg = AThread->Connection->ReadLn();
m_pRev = (FCommModule*)AThread->Data;
}
// catch(EIdSocketError& e) {
catch(...) {
AThread->Connection->Disconnect();
m_pRev = (FCommModule*)AThread->Data;
TList* pList = m_lstComModuel->LockList();
try {
pList->Remove( m_pRev ) ;
}
__finally {
m_lstComModuel->UnlockList();
}
m_pRev->Free();
AThread->Data = NULL;
// #ifdef _DEBUG
// Memo1->Lines->Add( e.LastError );
// #endif
return;
}
m_pRev = (FCommModule*)AThread->Data;
if(RevMsg.Length() <= 0 ) return; //empty data
Application->ProcessMessages();
.............이하 생략 ................
}
|