C++로 서버프로그램을 작성하고 java로 client TCP소켓 프로그램을 작성하고 ?
C++로 서버프로그램을 작성하고 java로 client TCP간 통신 프로그램을 작성했을 경우에,
accept가 일어나는 서버쪽에서 java가 악의적으로 connection을 계속 걸면
oveflow가 일어나서 서버는 다운됩니다. 이럴 경우 대처할 방법이 있나요 ?
MS Windows포럼에서는 WSAAccept,WSAConnect가 있어서 짝이 되서 condition이 성립될 수 있는데
일반적으로 normal socket모드에서는 어떤 이유인지 이 부분이 설명되는 부분을 찾을 수가 없네요 ?
서버 프로그램을 작성할때 connect만 client가 임의적으로 걸고 말아버리면 서버가 connect를 받을 수가 없는데
이런 경우 서버쪽에서 어떻게 프로그램을 개발해야 하나요 ?
accept시 timeout을 소켓옵션에서 둬서 일방적으로 data가 오가지 않을 경우 서버쪽에서 끊어지게 만들 수 있는데
이 방법밖에는 없나요 ?
두서리 없게 질문 올려 봅니다. 이 부분이 소켓프로그램을 해보면 제일 마지막 단계에서 발생하는 문제인것 같습니다.
데브피아도 올려보면 MS사에 직접 물어보라고 하는데 개발자들이 이런 답변을 하는 것을 보면 문제가 있는 것 같습니다.
리눅스 서버로 서버프로그램을 제작시 이 부분을 어떻게 대처해야 하는지 아시는 분 답변 주시면 감사하겠습니다.
SSL방식 말고 사용자가 정의하는 형태로 connection을 어떻게 해야할지 난감합니다.
수고하세요.
네 님말씀대로입니다. 윈도우도
네 님말씀대로입니다.
악의적인 connection에는 일정수 이상 접속 들어왔으면 accept() 받지 말아야죠.
데이터 교환없이 일정시간 connection이 유지되면 강제로 끊어서 다른 접속 받을 필요도 있지만, 이건 어떤 성격의 통신인지에 따라 적용 가능할수도 있고, 아닐수도 있습니다. telnet ssh같이 접속후 장시간 조작 안해도 끊어지지 말아야 할 통신도 있으니까요.
그래도 문제 발생한다면 개발자 레벨에서는 할수 있는거 없습니다. 운영시에 악의적인 connection을 줄이기 위한 보안대책을 강구해야죠. 방화벽 도입해서 특정 지점에서만 접속 허용한다든지 VPN으로 자기네들만의 독립망을 구성한다든지 등등.
이건 윈도우도 마찬가지고요.
WSAStartup(), WSACleanup()은 윈도우에서 소켓 라이브러리(윈속 DLL) 로드/언로드하는거밖에 안합니다.
timeout 걸때 리눅스는 보통 alarm()으로 시그널 받는 방법 씁니다.
alarm()을 쓰면 지정한 시간 뒤에 SIGALARM이 떨어지면서 block된 시스템콜에서 탈출합니다. 이때 -1 리턴하면서 errno는 EAGAIN이 남는데 이거 에러가 아니니 SIGALARM에 의한 강제탈출이니 상황에 맞게 처리해야겠죠.
Written By the Black Knight of Destruction
댓글 달기