none
tcp_keepalive 사용에 대해 질문 드립니다. RRS feed

  • 질문

  • IOCP 기반 서버 소켓 프로그램을 개발중입니다.

    프로그램은 잘 작동하는데 클라이언트가 비정상종료하여 재접속을 하는 경우가 발생하고 있어서

    이에 대한 대책으로 tcp_keepalive를 적용하였습니다.

    그러나 전혀 작동하지 않고 있습니다.

    코드는 아래와 같습니다.

    ClientSock = WSAAccept();

    struct tcp_keepalive keepAlive = { TRUE, 5000, 1000 };
    DWORD dwRet;
    if (SOCKET_ERROR == WSAIoctl(ClientSock, SIO_KEEPALIVE_VALS, &keepAlive, sizeof(keepAlive), NULL, 0, &dwRet, NULL, NULL))

    클라이언트가 접속 후 closesocket() 하지 않고 종료하였는데 이에 대해 전혀 감지를 못하네요

    구글링을 해봐도 별다른 해결책이 없습니다.

    컴퓨터가 꺼지거나 랜선이 뽑혀야만 감지를 하는지는 테스트 못해봤지만 방법이 잘못되었는지 궁금합니다.

    2020년 4월 21일 화요일 오전 1:23

모든 응답

  • 다음 문서에 따르면
    https://docs.microsoft.com/en-us/previous-versions/windows/desktop/legacy/dd877220(v%3Dvs.85)
    코드는 문제가 없는것 같습니다.
    클라이언트 reconnection 시간 간격이> 5000ms인지 확인하거나
    또는 SO_KEEPALIVE와 함께 기본 시간을 사용할수도 있습니다.
    keep-alive 옵션에 대한 자세한 내용은 RFC 1122의 4.2.3.6 섹션을 참조하시기 바랍니다.
    https://www.ietf.org/rfc/rfc1122.txt

    MSDN Community Support Ricky

    다른 커뮤니티 멤버에게 도움이 될 수 있게 문제를 해결 한 답변을 '답변으로 표시'를 클릭하시고 그렇지 않은 경우 '답변으로 표시 취소'를 클릭하시기 바랍니다. MSDN 서포트에 대한 의견이나 불만이 있을 경우 MSDNFSF@microsoft.com 으로 연락하시기 바랍니다.

    2020년 4월 28일 화요일 오전 5:46
    중재자
  • 결국 keepalive는 안되는듯하여 방법을 바꾸어 개발하게 되었네요...

    send(ClientSock, NULL, 0, 0);

    0바이트를 전송하여 연결 오류를 확인하는 폴링방식으로 했습니다.

    작동은 잘 됩니다.

    2020년 5월 28일 목요일 오전 8:28