달력

012018  이전 다음

  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  •  
  •  
  •  
매번 네트워크 프로그래밍을 할때마다 이놈의 기억력은 어따 팔아먹었는지 방법이 도통생각이 안납니다.

bind가 먼저인지, sock이 먼저인지.......후......그럴때마다 인터넷돌아댕기면서 하긴했는데.
아.....이건 아니겠다 싶어서 이렇게 쭉~~~ 정리를 해봤습니다.

(네......정말 글씨 개발새발이죠. 더군다나 정리하는 스타일도 썩.......ㅋㅋ)
그냥 아.....이런 흐름이었구나 라고 정도만 봐주셨으면 좋겠네요

TCP/IP책을 보고 정리하였습니다. 제목은......ㅋㅋ 황혼에서 새벽까지 라는제목이 갑자기 떠올라서.....ㅎㅎ



Posted by 오산돌구

 

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

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

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분만에 짠....ㅎㄷㄷ ) ㅋㅋㅋㅋ



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

Posted by 오산돌구