SSL 의 select 기능에 대한
글쓴이: 익명 사용자 / 작성시간: 화, 2003/06/24 - 1:54오전
openssl 을 이용한 보안통신을 하기위해서
평상시 해오던 방식을 떠올리며 SSL을 접해봤습니다.
Handle = socket( ... ); connect(socket ... ); SSL_new_socket(Handle, NOCLOSE); SSL 인증.....처리 쭈욱~~
이런식으로 소켓의 핸들을 계승받아 SSL을 처리하는 루틴을 만들었습니다.
잘돕니다.
근데 문제는 다음과 같습니다.
보내는데서 정확히 얼마를 보낼지는 모르는 상태이지만 예를 들어 약 30바이트라고 하겠습니다. 헌데 저는 한번에 읽는 버퍼크기를 10바이트로 했습니다. 그리고 마냥 block될수 없다는 이유로 Handle에 select 를 걸었습니다. 오~ 첫번째는 select가 잘됩니다. 그래서 10바이트는 수신했습니다. 데이터 맞습니다. 맞고요. 잘들어왔는데... 헛! 아직 20바이트가 남아서 select를 한번 더 걸도록 했습니다. 여기서 문제가 발생하네요. select가 먹통(block)되버립니다. 즉, 이미 SSL의 버퍼에 들어갔다는 예기밖에 안될거 같다는 ....
결국 ioctl(FIONREAD) 을 사용하여 읽을때 순차로 빼는 식으로
방법을 전환하여 구현을 하기는 했지만 (잘돌다 못해 눈물이 남.)
문제는 제 성격상 이것을 꺼림직해 한다는 겁니다.
그래서 질문은 이겁니다.
SSL관련 select 기능은 무엇인가요? 간략한 앞뒤 문맥만 이해가능하면 되는 예제도 있으면 좋고요.
Forums:
SSL & SELECT
> 보내는데서 정확히 얼마를 보낼지는 모르는 상태이지만
제 생각에는 보내는데서 정확히 얼마를 보내는지 알수 있도록 해주는게 우선하지 않을까 생각됩니다. 통신에서 주고 받는 크기를 미리 알수가 없으면 이거 참 난감하게 돼죠. 그래서 별의별 방법을 다 쓰게 되는것 같습니다. 결국에는 나중에 코드를 보아도 뭐가 뭔지 잘 모르겠고. 하여간 크기를 미리 알수 있도록 지정해주시는게 좋을듯 싶습니다. 정의 경우입니다. SSL 통신의 경우
1. [비암호화된 HEADER] + [암호화된 BODY]
그리고
[암호화된 BODY] 안에 다시
[HEADER]+[BODY]+[TRAILER]
이런식으로 되어 있는데
첫번째 방법만 사용해도 괜찮을듯 싶습니다. 이중 비암호화된 HEADER 부분은
구조체를 이용하여
암호화 레벨
BODY 크기 <------ 이부분
데이터 타입[바이너리인지 아스키인지 등등]
뭐 이런것을 정의해서 사용합니다.
이럴 경우 BODY 부분이 아무리 가변적이라고 해도 비암호화된 HEADER를(정의된 사이즈) 읽게 되면 알게 되잖아요.
예전에 제가 한번 이곳에 올린적이 있는데 저도 예전에 어떤 웹서버와 통신하는데 그쪽 개발자가 HTTP 통신의 컨텐츠 렝스 부분을 뭉개 버리구 주던적이 있어서 사이즈를 알수 없는것을 만든적이 있는데 이건 좀 아니더군요.
> 여기서 문제가 발생하네요. select가 먹통(block)되버립니다
SELECT 가 블락 되는경우는 없을듯 싶습니다. 타임아웃이나 이런것을 정의해 주셨나요.? 아마 SELECT 이후 이전의 처리등에서 블락이 되지 않았나 싶습니다. 한번 이 부분 소스를 올려 주시면 어떨까요.?
Re: SSL & SELECT
음... 실제 구성은 그렇게 하긴 합니다. 하지만 문제는 그것과는 상관 없더군요.
저의 목표는 네트웍망이 일시적으로 이상이 생겨도 다시 정상화 될때
다시 정상적인 구동이 되는게 목적입니다.
만약 이런경우라면 어떨까요?
1. 4바이트는 길이정보를 갖는 헤더
그 이후 길이만큼의 데이터가 온다고 구성했다고 하겠습니다.
2. 일단 4바이트를 읽었습니다.
길이헤더를 보니까 다음에 올 데이터는 32Kbyte라고 보였습니다.
3. 그런데 이순간 네트웍에 이상이 발생했습니다.
32KByte데이터를 보내려는 서버가 타임아웃으로 보내지 않았습니다.
(꼭 네트웍 이상이라기 보다는 전송속도가 급격히 떨어진 경우도...)
4. 4바이트 읽은후에 그 길이만큼의 데이터를 클라이언트가 읽으려고 시도했습니다.
5. 클라이언트는 이제 다시는 깨어나지 못하는 블럭상태가 됩니다.
(서버가 연결을 끊지 않는동안 영원히....)
이런경우라면 어떻게 해야 할까요?
물론 알람 시그널을 사용해서 이 소켓을 shutdown 시켜서 무효화 시켜서 빠져나올수는 있을겁니다.
하지만 다시 connection을 맺어야 하는 것이 필요하죠.
되도록 서버의 부하를 줄이고자 connection은 자제를 하고 싶어요~
중요한것은 SSL관련 select함수가 있는냐는 것이 궁굼해요.
상황을 이렇게 만들려고 한것은 아니고 지금은 어찌되었건 잘 돕니다.
그러나 분명히 SSL관련 select가 있을것으로 보여서
나중에 써먹을거 생각하고 질문 던져본것이지요.
댓글 달기