안녕하세요
도저히 모르는게 있어서 질문드립니다
얼마전에 서버 프로그램을 하나 짰습니다
TServerSocket 을 사용했구여 클라이언트는 1 개만 접속하는 아주 간단한
구조입니다
클라이언트가 접속하면 DB 에 새로운 항목이 추가되었는지 체크해서
새로운 항목이 있을때만 클라이언트에게 문자열로 날려주는게
주된 Process 입니다
근데 한 30분정도 잘되다가 10053 번 에러가 뜹니다 -_-
클라이언트쪽에선 접속이 끊어지면 30 초 간격으로 재접속을
시도하도록 되어있는데 저 에러가 발생하면 30 분정도 있다가
접속이 되더군여
게시판 다 검색해보고 MSDN 도 뒤져보고 했는데
마땅한 답이 별로 없었습니다
제가 알아낸건
1. 데이터 전송중에 클라이언트의 접속이 갑자기 끊어져서 그렇다
2. 서버쪽에서 끊어버리는것이다
3. 소켓 큐에 남은 공간이 없어서 그렇다
이정도 밖에 못알아냈습니다
다른건 다 그렇다쳐도 왜 클라이언트쪽에서 재접속을 못하는걸까요
로그를 남겨서 살펴봤는데 끊어지고나서 정확이 30분이 지나야
재접속이 됩니다 ( 1분도 틀리지 않습니다 -_- )
클라이언트쪽이 문젠지 서버쪽이 문젠지 서로 다른 답을 하신 분들이
많아서 그것도 아직 확실히 못알아냈습니다
어느부분을 체크해봐야 할까요
지금 해놓은 조치라곤 에러에 상관없이 에러가 발생할때마다
서버소켓을 닫았다가 5초뒤에 다시 오픈하는정도입니다
머.. 물론 그래도 마찬가지지만여.. -_-;;
혹시 비슷한 경험을 해보신 분 계시면 힌트라도 좀 주셨으면 좋겠습니다
이거땜에 요즘 머리가 많이 아파서여..
항상 도움만 받아가는데 죄송스럽구여
다시 한번만 조언 부탁드리겠습니다
감사합니다
에러코드 입니다. 왜 클라이언트가 비정상 적으로 끊기는지는 모르겠지만..
저도 비슷한 프로그램을 만든적이 있는데, 클라이언트에서는 약 10초마다
서버에 접속을 요구합니다.(연결이 되어있다면.. 연결 타이머를 false 시킵니다)
서버쪽에서, 클라이언트의 비정상 종료시에 해당 client 소켓을 close시키시나요?
참고로, 제가 예전에 작성했던, 코드를 올립니다
//------------------------------------------------------------//
// Client 쪽 - 서버에 접속 시도
//------------------------------------------------------------//
procedure Tfrm_main.Login_TimerTimer(Sender: TObject);
begin
Login_Timer.Enabled := False;
AttemptConnect;
end;
Procedure Tfrm_main.AttemptConnect;
begin
if ClientComm.ConnectionState = Connected then Exit;
if ClientComm.ConnectionState = Closed then Exit;
ClientComm.Start(ServerIp, 9000, MyMacAddress); {서버에 접속 시도}
end;
//----------------------------------------------------------------------//
// 서버 쪽 - TServerComm - ServerSocket 이벤트
//----------------------------------------------------------------------//
Procedure TServerComm._OnAccept(Sender: TObject;Socket: TCustomWinSocket);
begin
Display_EVENT_MSG(Socket.RemoteAddress + ' ' + LoginMsg, 0);
end;
Procedure TServerComm._OnClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
begin
Display_EVENT_MSG(Socket.RemoteAddress + ' ' + LogoffMsg, 1);
end;
Procedure TServerComm._OnClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
ErrorCode := 0;
Socket.Close;
end;