소켓 프로그래밍에서 질문있습니다..

qodwlql의 이미지

if (read(aaaaa, cc, 5 ) <= 0) {
LogWrite("Error.",id, 0);
return(-1);
}

bb = atoi(cc);
aa = 5;

while(aa< bb) {

memset(cc, 0x00, sizeof(c));

if (read(aaaaa, cc, 512) <= 0) {
LogWrite("Error.", id, 0);
return(-1);
}

dd= strlen(cc);
aa += dd;

}

=========================================
소켓프로그래밍에서 왜 저기서 aa에다가 5를 지정해주고while 문을 이용해서 다시 512byte 만큼 읽어와서 aa에다가 dd를 더해줘서 반복문을 돌리는지 궁금합니다 ㅠㅠ

shyblue의 이미지

너무 기본적인 내용이라 아무도 답을 안해주시는듯 하네요.
질문을 하시기전에, 소켓에 대한 책이나 글을 깊이 읽어보셨으면 합니다.

: aa에다가 5를 지정해주고 <<
보통 패킷 프로토콜을 만들때, 헤더를 만들고 헤더에 패킷의 사이즈를 넣는 방법을 씁니다.
여튼, 어떠한 이유에서 5byte를 헤더로 만들었고, atoi(cc)를 한걸 보니 읽어온 5byte가 나머지 패킷의 길이네요.

:

 aa = 5, while( aa < bb )

인 이유는, 헤더가 5byte니까 aa는 읽은 byte 수를 저장하는 변수로 사용하고 있으므로, 이미 읽은 헤더의 byte가 5라서 5로 초기화 하고
bb는 위에서 설명한거 처럼 패킷의 전체 길이인데, aa=5로 시작하는 것으로 봐서 패킷헤더에 오는 패킷길이는 헤더의 길이5까지도 포함한 길이를 패킷의 전체 길이로 보내는것 같습니다.
그러래서,

while( aa < bb )

는 소켓에서 읽은 byte수가 패킷의 전체길이(bb)보다 작으면 계속 소켓에서 읽을 수 있도록 루프를 돌게 합니다.

: 다시 512byte만큼 읽어와서
이부분의 해석은 틀렷습니다.
read()함수의 설명을 다시 보세요. 512byte만큼 읽어 오는게 아니라, 최대 512byte만큼 읽어 오는겁니다. buffer overflow를 생각하시면 되겠습니다.
즉,

read( aaaaa, cc, sizeof(cc) ), sizeof(cc) == 512

라고 생각하세요.
cc에 읽어와서 저장하고, cc의 길이만큼이 소켓에서 읽은사이즈라고 생각하고( 이건 왜 이렇게 했는지 모르겠군요, read함수의 반환값이 읽은 byte의 수인데,
if( (dd = read( aaaaa, cc, 512) <= 0 ) {...} aa += dd;
가 더 바람직할텐데요 )
읽은 byte수를 얘기하는 aa에데가 방금 읽어들인 byte수를 더해서 지금까지 읽은 총 byte로 만듭니다.

일단, 이 소스가 어디서 만들어진 sample소스라면 다른 소스를 보시라고 얘기해 드리고 싶네요. ^^;

時日也放聲大哭

時日也放聲大哭

댓글 달기

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