적당한 recv버퍼 사이즈?

lkjt의 이미지

string HtmlSource;
char recvbuf[1500] = "";
while(recv(m_sock, recvbuf, sizeof(recvbuf), 0)!=0)
HtmlSource += recvbuf;

이렇게 해서 Html소스를 받고 있는데요...

중간에 보면

뛝 이런것등 이상한 문자들이 껴있네요.

버퍼 사이즈 문제인거 같은데 어떻게 해야 적당한가요?

pynoos의 이미지

받은 크기를 받아서 0이 아닌지만 사용할 것이 아니라
recvbuf 를 NUL 로 강제 종료시켜줘야합니다.

랜덤여신의 이미지

recv 함수의 결과값을 받아서

buf 의 recv 인덱스를 0 으로 세팅해주세요.

buf[iRcvd] = 0;

lkjt의 이미지

string HtmlSource;
char recvbuf[1500] = "";
while(recv(m_sock, recvbuf, sizeof(recvbuf), 0)!=0)
{
HtmlSource += recvbuf;
recvbuf[0] = NULL;
}

lkjt의 이미지

이렇게 해줘도 똑같네요.

랜덤여신의 이미지

lkjt wrote:
string HtmlSource;
char recvbuf[1500] = "";
while(recv(m_sock, recvbuf, sizeof(recvbuf), 0)!=0)
{
HtmlSource += recvbuf;
recvbuf[0] = NULL;
}

lkjt wrote:
이렇게 해줘도 똑같네요.

lkjt 님의 문자열 개념이 정립되지 않으신 듯 합니다.

아시다시피, C에서의 문자열은 끝이 NULL(즉, 0)로 끝나는 배열 입니다.

그런데 소켓으로 받은 문자열 버퍼에는 어디가 문자열의 끝인지 알려주는 NULL 문자가 없습니다.

다만, recv 함수의 결과값으로 서버에서 읽혀진 데이터의 바이트 수가 반환되는데, 이것을 바탕으로 버퍼에 직접 NULL 문자를 표시해주게 되는 것입니다.

자, 떠먹여주기는 여기까지... :D

pynoos의 이미지

사족이지만..

NULL, NUL에도 차이가 있습니다. :)

http://bbs.kldp.org/viewtopic.php?t=29882

lkjt의 이미지

아, 그런말이엿군요.

전 문자열 초기화 시키라는건줄 알고..--;;

맨앞에 널을넣어서 --ㅔ;;;

그런말이엿군요..

lkjt의 이미지

흠,,그런데 약간 당황스러운게

배열은

0~1499 까지 있는데 만약에 1500바이트를 받아서 1500를 리턴햇다면
1500번지에 NULL을 넣으란 소리인가요?--;;;

런타임 에러 납니다.

sodomau의 이미지

그러니까 배열 사이즈보다 한 바이트 적게 받아야죠

lkjt의 이미지

전 그래서 배열은 한개 크개 했습니다.

pynoos의 이미지

lkjt wrote:
전 그래서 배열은 한개 크개 했습니다.

여기에도 커다란 취향이 있죠.

버퍼의 크기를 상수로 정해놓고, 배열을 버퍼크기 + 1로 잡을 것이냐,
배열을 버퍼에 맞추고 버퍼 크기 - 1로 받을 것이냐.

제가 권하는 것은

char buf[BUFFER_SIZE];

recv( s, buf, sizeof buf -1,0 )

으로 표현하는 것을 좋아합니다.

아래 둘다 비선호... BUFFER_SIZE 를 MAX_SIZE 바꿔야할일이 생길경우 일일이 바꿔야하므로...

char buf[BUFFER_SIZE];

recv( s, buf, BUFFER_SIZE-1,0 )

char buf[BUFFER_SIZE+1];

recv( s, buf, BUFFER_SIZE,0 )

댓글 달기

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