[질문] 소켓 프로그래밍에서요... 중간에 무한루프도 아니고 그?

lee3390의 이미지

서버는 mysql과 연동하여 클라이언트에서 받은 쿼리문을 mysql에 보내고

그결과를 파일로 만든 후 그 파일을 다시 읽어서 클라이언트에 보내주는

역할을 하고, 클라이언트는 mysql 쿼리문을 서버에 보낸 후 서버에서 보내

주는 쿼리문에 대한 결과를 파일로 저장하는 역할을 합니다.

여기서 문제는 클라이언트가 서버에서 보내주는 쿼리에 대한 결과를 읽어

파일에 저장을 하는데

            while((n=read(fd,buff,sizeof(buff))) > 0 )
            {
                write(clientfd,buff,n);
                bzero(buff,sizeof(buff));
            }

처음 한번 read는 잘되고 2번째에 read에서 멈춰버리네요 무한루프 도는

것도 아니고 아무일 없이 멈춤상태가... 그래서 프로그램을 제대로 빠져나

오질 못합니다. 무엇이 잘못된 걸까요..?

몇시간째 이것만 쳐다보다 안되서 올려봅니다... ㅠ.ㅠ

원본 소스 첨부합니다.

File attachments: 
첨부파일 크기
파일 client.c1.43 KB
파일 server.c3.73 KB
mach의 이미지

흐름제어(tcp flow control) + 버퍼(tcp internal buffer) 문제로 보입니다.
일단 다음 코드를 (server.c 95 line)

           while((n=read(fd,buff,sizeof(buff))) > 0 )
            {
                write(clientfd,buff,n);
                bzero(buff,sizeof(buff));
            }

다음 처럼 수정한 후 증세를 얘기해 주세요.
           while((n=read(fd,buff,sizeof(buff))) > 0 )
            {
                write(clientfd,buff,n);
                bzero(buff,sizeof(buff));
                usleep(500000); // 0.5초 sleep
            }

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

lee3390의 이미지

아무 변화가 없습니다.

client에서 n값인 128과 그아래 프린트해준 0을 찍어주고는 멈추네요 다운된것

처럼요. 서버를 종료하면 그때서야 1과 2가 찍히며 client가 종료됩니다.

왜 멈추는지 이유를 알수가 없네요..

IsExist의 이미지

fd를 non-blocking으로 만들고 select를 사용해서 버퍼가 준비되면 read를
호출하는 걸로 하세요.

서버에서 write를 할때도 성공했는지의 유무도 확인하세요.

서버에서 모두 write한후 client가 다 받았음을 확인하고 close 하는것도 잊지 마시기 바랍니다. 이렇게 할려면 서버가 보낼 양을 먼저 client가 수신을 하고 client는 그 기대만큼 read를 시도 하게 해야 합니다. 서버의 write가 성공적이였다고 해서 서버 tcp 스택에서 client의 tcp 스택으로 옮겨 졌다고는 볼 수 없습니다.

무조건 보내고 무조건 받는 식의 구현은 신뢰할수 있는 방법이 아닙니다.
얼마만큼 보낼 예정이고 얼마를 보냈는데 그만큼 받았는지 확인하는 형태로 작성해야 합니다.

---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

mach의 이미지

음 다음 글을 한번 읽어보시지요.
비슷한 문제로 보입니다.
http://bbs.kldp.org/viewtopic.php?t=36468

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