네트워크 프로그래밍에서요

hairpin의 이미지

어떤 string 자료를 symmetric key로 encrypt해서 보내려고 합니다. 그런데 symmetric key로 encrypt했을 때, 원래의 string이 encrypt 되어서 나오잖아요. 이걸 send(sockfd, buffer, BUFFER_MAX, 0)로 여러 번 나눠 보내야 하거든요(보내려는 양이 좀 많아서요). 그런데 이걸 나눠서 보내면, 나누는 부분이 제대로 나눠지지 않는 것 같아요. 그러니까 첫 번째 보낸 패킷의 끝부분과 두 번째 보낸 패킷의 앞부분이 서로 연결되어 제대로 나와야 하는데, 그게 안 되네요. 따라서 저 패킷을 받는 사람이 다시 decrypt할 수가 없네요.

말이 좀 꼬였는데, 중요한 것은... packet을 보낼 때 그 내용이 연결된 스트링일 경우 망가지지 않게 보내는 방법은 없는가 하는 걸 묻고 싶어서요. buffer의 크기를 한없이 키울 수는 없잖아요. encrypt한 것이 대충 20000byte 정도 되는데 buffer는 60 정도로 잡았으니까요. buffer를 저거에 맞게 키울 수도 없는 일이고요. 답변 기다리겠습니다.

용가리의 이미지

c/s간에 프로토콜을 정의하셨는가요?
그냥 encrypt 된 것을 보내면 수신측에서 어떻게 재조립
하겠습니까? 적어도 재조립 할 수 있는 정보를 추가해서
보내세요...... 적어도 다음과 같은 헤더를 추가하여서
수신측에서 이 헤더를 보고 재조립 할 수 있도록 하십시오.

typedef struct commhdr {
unsigned short len; // 이 헤더 이후의 데이터 패킷의 길이
unsigned short seq; // 순서번호
char chMore; // 원 패킷의 마지막이냐 아니냐 여부
char achData[1]; // 여기부터 encrypt된 데이터가 오면 됩니다.
} COMMHDR;

이렇게 한 후 수신측은 먼저 5바이트를 먼저 읽고 len 필드를
참조하여 해당 길이만큼만 소켓버퍼로부터 읽어 들이면 되겠지요.
그래서 재조립 하면 됩니다.
그럼 수거여!

mach의 이미지

혹시나 노파심에서 말씀드리는데, encrypt를 수행하고 나면 string이 아닐 수 도 있지 않나요? 이를테면 "abcd안녕" 모 이런 문자열이 encypt()를 거치면 중간에 "aXU90...\0...XAX8" 이런식으로 중간에 null문자를 포함하지 않나?라는 겁니다. 이 경우에 대한 해결은 위에서 댓글 달아주신분이 언급하신 방법이 있고(바이너리 전송으로 간주하는 법, 주로 mem...()시리즈 함수로 코딩, 보통 별개의 프로토콜을 만들어서 사용), 다른 방법도 있습니다.

다른 방법은 성능상으로는 아주 불합리한 것인데, Base64같이 헥사스트링으로 바꿔서 보내는 것이지요. 이는 메일전송에서 주로 사용하는 것인데요. 전송내용이 최악의경우 2배정도 늘어나는 단점이 있습니다. 물론 str...()관련 함수로 모든 코딩이 가능하지만요.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.