SSL 의 select 기능에 대한

익명 사용자의 이미지

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 기능은 무엇인가요?
간략한 앞뒤 문맥만 이해가능하면 되는 예제도 있으면 좋고요.
펑키의 이미지

> 보내는데서 정확히 얼마를 보낼지는 모르는 상태이지만

제 생각에는 보내는데서 정확히 얼마를 보내는지 알수 있도록 해주는게 우선하지 않을까 생각됩니다. 통신에서 주고 받는 크기를 미리 알수가 없으면 이거 참 난감하게 돼죠. 그래서 별의별 방법을 다 쓰게 되는것 같습니다. 결국에는 나중에 코드를 보아도 뭐가 뭔지 잘 모르겠고. 하여간 크기를 미리 알수 있도록 지정해주시는게 좋을듯 싶습니다. 정의 경우입니다. SSL 통신의 경우

1. [비암호화된 HEADER] + [암호화된 BODY]

그리고
[암호화된 BODY] 안에 다시

[HEADER]+[BODY]+[TRAILER]

이런식으로 되어 있는데

첫번째 방법만 사용해도 괜찮을듯 싶습니다. 이중 비암호화된 HEADER 부분은
구조체를 이용하여

암호화 레벨
BODY 크기 <------ 이부분
데이터 타입[바이너리인지 아스키인지 등등]

뭐 이런것을 정의해서 사용합니다.

이럴 경우 BODY 부분이 아무리 가변적이라고 해도 비암호화된 HEADER를(정의된 사이즈) 읽게 되면 알게 되잖아요.

예전에 제가 한번 이곳에 올린적이 있는데 저도 예전에 어떤 웹서버와 통신하는데 그쪽 개발자가 HTTP 통신의 컨텐츠 렝스 부분을 뭉개 버리구 주던적이 있어서 사이즈를 알수 없는것을 만든적이 있는데 이건 좀 아니더군요.

> 여기서 문제가 발생하네요. select가 먹통(block)되버립니다

SELECT 가 블락 되는경우는 없을듯 싶습니다. 타임아웃이나 이런것을 정의해 주셨나요.? 아마 SELECT 이후 이전의 처리등에서 블락이 되지 않았나 싶습니다. 한번 이 부분 소스를 올려 주시면 어떨까요.?

익명 사용자의 이미지

펑키 wrote:
제 생각에는 보내는데서 정확히 얼마를 보내는지 알수 있도록 해주는게 우선하지 않을까 생각됩니다.

음... 실제 구성은 그렇게 하긴 합니다. 하지만 문제는 그것과는 상관 없더군요.
저의 목표는 네트웍망이 일시적으로 이상이 생겨도 다시 정상화 될때
다시 정상적인 구동이 되는게 목적입니다.
만약 이런경우라면 어떨까요?

1. 4바이트는 길이정보를 갖는 헤더
그 이후 길이만큼의 데이터가 온다고 구성했다고 하겠습니다.

2. 일단 4바이트를 읽었습니다.
길이헤더를 보니까 다음에 올 데이터는 32Kbyte라고 보였습니다.

3. 그런데 이순간 네트웍에 이상이 발생했습니다.
32KByte데이터를 보내려는 서버가 타임아웃으로 보내지 않았습니다.
(꼭 네트웍 이상이라기 보다는 전송속도가 급격히 떨어진 경우도...)

4. 4바이트 읽은후에 그 길이만큼의 데이터를 클라이언트가 읽으려고 시도했습니다.

5. 클라이언트는 이제 다시는 깨어나지 못하는 블럭상태가 됩니다.
(서버가 연결을 끊지 않는동안 영원히....)

이런경우라면 어떻게 해야 할까요?
물론 알람 시그널을 사용해서 이 소켓을 shutdown 시켜서 무효화 시켜서 빠져나올수는 있을겁니다.
하지만 다시 connection을 맺어야 하는 것이 필요하죠.

되도록 서버의 부하를 줄이고자 connection은 자제를 하고 싶어요~

중요한것은 SSL관련 select함수가 있는냐는 것이 궁굼해요.

상황을 이렇게 만들려고 한것은 아니고 지금은 어찌되었건 잘 돕니다.

그러나 분명히 SSL관련 select가 있을것으로 보여서

나중에 써먹을거 생각하고 질문 던져본것이지요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.