ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 경계없는TCP/IP 데이타, 임의로 경계단위로 수신하기
    개발하면서/etc 2009. 10. 6. 21:17
    반응형

     

     

     

    위 그림은 지금 하고 있는 프로젝트이다.
    나중에도 도움이 될것 같아서 이렇게 글을 남긴다.

    우선 그림에 대한 간략한 소개를 하면,

    Admanager는 DB를 일정간격으로 갱신여부를 감시하고, 갱신될 경우 그 데이타를 가져와서 Adserver로 전송하는 역할을 한다.

    Adserver는 받은 데이타를 가공하고 저장한뒤 사용자 접속시 해당 데이타를 뿌려주는 역할을한다.
    여기서는 Admanager와 Adserver사이에 대해서만 얘기하기로 하자.Admanager에서 전송할 데이타는 탭 단위로 구분 되어있고, 마지막은 \n 이다.
    즉, Admanager는 record 단위로 전송을 하고, Adserver는 record 단위로 처리를 해주면 되는것이다.
    근데 이게 왜 문제가 될까


    위의 그림을 보면 Adserver에서 수신한 데이타가 두개의 record를 한번에 읽었다.

     

    왜그럴까. . .

    TCP/IP는 데이타간의 경계가 없다는것, 그리고 Server Area, Client Area에는 버퍼가 있다는 것을 생각안하고 개발 했기 때문이다.

    Adserver에서 수신후 처리할때 Admanager에서 두개의 데이타를 전송하게 된것이다.
    그걸 알리 없는 Adserver는 버퍼에있는 데이타를 정해준 크기만큼 읽게되고 { read(c_socket, buf, buf_size); buf_size를 말함} 

    저런식으로 다수의 record가 한번에 읽어져서 실제 DB의 record갯수와 수신한 데이타 갯수가 일치하지 않는것이다.

    개선방법은 간단했다. \n을 기준으로 한줄씩 읽기
    소스는 아래와 같다. (소장님이 2분만에 짠....ㅎㄷㄷ ) ㅋㅋㅋㅋ

     

    이 글은 저의 이해 및 정리한 것이므로 사실과 다를 수 있습니다.
    틀린점은 지적해주시면 감사하겠습니다.

    반응형

    댓글

Designed by Tistory.