Q&A

  • 클라이언트의 커넥션이 제대로 안닫힐 때...
안녕하세요?
소켙 커넥션 문제로 몇일 째 고민중입니다.

서버 소켙이 하나 있구요.
클라이언트 소켙이 필요한 작업이 생길 때마다 접속을 해서 필요한 처리를 한 후에 접속을 끊습니다. (처리건수가 약 1만건 정도 됩니다.)
클라이언트는 정상적인 방법으로 종료를 합니다. 그런데 이런 경우에도
서버의 커넥션이 물리적으로 살아 있는 경우가 있는지요? 있다면 어떻게
처리를 하면 좋죠? 그리고 이게 머신상의 특성 땜에 그런지요?(윈200서버사용)
이거 땜에 머리 돌아 버릴것 같습니다. 고수님들 좀 부탁드려요
2  COMMENTS
  • Profile
    박성훈 2003.06.17 21:56


    전에 델파이 소켙으로 처리했을 때 발생했던 문제입니다.
    클라이언트에서는 정상적으로 소켙을 닫았구요.
    그래서 소켙을 바꿔볼라구 ics컴포넌트 예제들을 살펴봤습니다.
    예제 중에서 해결방법이 있더군요. 예제를 변형해서 사용하니까
    해결이 되더군요. 현재 잘 동작하고 있습니다.
    참고로 상대방 기종은 IBM 텐덤서버에 UNIX이구 저희쪽은 WIN2K서버입니다.
    답변 주셔서 감사합니다.
  • Profile
    방재웅 2003.06.17 01:38
    안녕하세요. 답변이 늦어졌네요.

    우선 박성훈님께서 델파이로 개발하셨을 텐데,
    어떤 컴포넌트를 사용하셨는지 안 적혀 있어서
    정확한 답변이 될 수 없음을 감안하세요.

    서버프로그램에서 클라이언트의 소켓정보를
    연결리스트나 배열 등의 기법으로 관리를 하실겁니다.

    일반적인 소켓프로그래밍 기법에서 보면

    서버에는 클라이언트의 연결을 대기하는 Listen() 소켓과
    연결 됐을 때 클라이언트와 통신하는 소켓이 여러개 존재합니다.

    서버에 약 1~5개의 클라이언트 소켓정보를 가진 소켓이 존재할 때
    각 각은 클라이언트 소켓과 연결이 되어 있죠.

    보통 클라이언트 소켓이 Close 될 때 서버소켓에서는
    OnClientDisconnection()등의  이벤트가 발생합니다.

    즉 클라이언트 1번이 닫히면 서버측의 1번 소켓도
    OnClientDisconnection() 함수에서 닫아줘야 겠죠.

    만일 비정상적인 방법으로 클라이언트가 종료되면
    연결이 끊어져도 서버에서는 소켓정보가 살아있죠.

    여기에서 발생하는 문제가 아닐까요?

    서버에서 가지고 있는 소켓정보들이 살아있는지
    정보를 날려보는 방법으로 체크하 실 수 있습니다.
    (HeartBeat?) 일종의 폴링기법이죠.