read, recv 함수가 자료수신할때..

sinta의 이미지

안녕하세요 read, recv 함수에 대해 문의드리려고 합니다.

현재 소켓통신으로 전문을 주고 받는 프로그램을 하고 있습니다.

서버에서 보낸 전문을 클라이언트에서 수신하게 되는데

클라이언트는 OS는 리눅스이고 C로 수신하게 되어 있습니다.

read함수를 사용해서 소켓연결자에서 특정사이즈만 받는 경우가 자주 발생하고

가끔 정상적으로 수신합니다. recv로 수정해도 마찬가지인경우인데요....

read나 recv함수가 정상적으로 수신하지 못하는 경우 이런 현상이 발생하는 경우가 있나요?

read하는 부분 소스만 첨부합니다.

while ((nSendLen = recv(nSvrSock, rcvbuf, sizeof(rcvbuf), 0)) > 0)
{
memcpy(&readbuf[nRcvLen], rcvbuf, nSendLen);

memset(gcaErrMsg, 0x0, sizeof(gcaErrMsg));
sprintf(gcaErrMsg, "수신한값[%d] : %s", nSendLen, rcvbuf);
l_errlog(gcaPgmID, gcaErrMsg, LOG4);

nRcvLen += nSendLen;
memset(rcvbuf, 0x0, sizeof(rcvbuf));

/* if (rcvbuf[nRcvLen] == '\0') break; */
if (nSendLen < 2048) break;
}

Fe.head의 이미지

if (nSendLen < 2048) break;

이부분이
if (2048 < nRcvLen) break;

이렇게 되야 되지 않을까요?

-----------------------
좋은사람한테 잘해라, 물어보자 남의 머리속을 볼수 없으니..
2010. 1. 20일을 기억하기를 바라며

고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"

sinta의 이미지

2048씩 읽어온 후 읽어온 크기가 2048보다 작으면 break로 빠져나가기 위해 만든 조건문입니다.

아.. 제가 nRcvLen에 대한 설명이 없었네요..
nRcvLen은 배열 주소로 사용하기 위해서 0에서 시작해서 읽어온 nSendLen을 계속 더해가는 변수입니다.

이상한건.. 이게 성공할떄는 정상적으로 읽어오지만 실패할떄는 항상 1460 이라는 사이즈만 읽어서 실패하게됩니다.

그리고 데이터의 크기가 커질수록 성공횟수는 현저하게 줄어들고요..
기본적으로 1460의 크기만큼 Read를 못해서 실패한다고 생각하고 있었는데..

만약에 1460보다 작은 사이즈로 계속 while로 읽는다면 성공해야하지 않을까 싶습니다. (제생각엔...)
그런데 1048로 읽어와도 1460에서 종료가 발생합니다.

소켓연결자인 nSvrSock 자체에 1460만 들어왔다고 생각하는게 맞을까요??

댓글 달기

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