C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[54754] Re: 이렇게 한번 해보세요~
설현도 [st8123] 1521 읽음    2008-10-04 13:03
아마도 TClientSocket 과 TServerSocket를 사용하신다는 가정하에 말씀드리겠습니다.

본디 소켓 프로그래밍을 API로 작성시에는 데이터 수신 이벤트 (OnRead)의 발생 조건을
동기나 비동기 방식으로 설정 할 수 있습니다.

동기라 함은 버퍼에 데이터가 있을경우 자동으로 OnRead() 함수가 호출 되는 것을 의미하구요.
비동기는 버퍼에 데이터가 있건 없건 OnRead() 이벤트를 사용하지 않겠다는 것입니다.

제가 몇가지 테스트를 해본 결과 TClientSocket 과 TServerSocket 컴퍼넌트는
1. 처음 데이터 수신시 OnRead() 이벤트가 발생 후,  [동기 -> 비동기] 형식으로 바뀜.
2. Receive() 함수 호출에서 [비동기 -> 동기]로 바뀜.
3. Receive() 함수를 호출 하더라도 OnRead() 함수가 리턴하기 전까지는 [비동기] 방식유지.

그리하여 유추해 보자면
메세지 순서를 A, B, C 로 보자면
1. A 메세지 도착 후.  OnRead() 함수 수행시간이 50ms 넘게 지연됩니다.
2. OnRead()가 수행중에 B메세지 도착하면 비동기 방식으로 그냥 버퍼에 쌓이게 됩니다. (50ms 경과)
3. 그 후 C 메세지가 도착하게 되면 동기방식으로 설정되어 B, C메세지가 동시에 들어옵니다. (100ms)

4096바이트로 송신시 괜찮은 문제는
전송시간이 1024바이트 보다 길어지기 때문에 OnRead()에서의 수행이 끝나고
버퍼에 모든 데이터가 들어와서 일정 시간 간격으로 차례차례 처리 되었다고 볼 수 있습니다.

해결방안으로는 컴퍼넌트는 어찌되었든 수정할 수 없기 때문에

1. OnRead()에서의 수행시간 단축
   - 제가 쓰는 방법으로는 OnRead()에서는 데이터를 읽기만 하고 바로 return 시킵니다.
   - 그렇게 읽은 데이터를 스레드나 별도의 방법을 통해 처리해서 구동시킵니다.

2. 소켓의 ReceiveLength()를 계속해서 체크하여 데이터가 존재 할 경우 읽어서 처리하는 수 밖에 없습니다.
   - 스레드 : 시스템 속도에 영향을 받겠지요.
   - 타이머 : 아무리 짧게 설정해도 하드웨어 특성상 57ms 정도의 주기로 밖에 설정이 되지 않는다고 합니다.

더 좋은 해결 방안이 있으면 저에게도 알려주시기를 ^^

저도 부산에서 올립니다~~~~


기둥 님이 쓰신 글 :
: 프로젝트 중 수행중인데, 문제에 봉착해버렸습니다. ㅜㅜ
:
: 50ms 주기로 보드에 있는 TCP 클라이언트에서 PC에 있는 TCP서버에 1024 바이트 문자 배열을 송신합니다.
: 50 ms 통신 주기를 유지하는 것이 매우 중요합니다.
: 그런데, 수신하는 서버에서 멀티미디어 타이머를 이용해서 서버에서 수신 당시 시간을 측정 해보니,
: 50 ms 주기로 데이터가 들어 오기도 하지만, 50 ms 의 두배인 100 ms 근처에 두 개의 데이터가 들어 오기도 합니다.
: 물론 TCP이니 데이터는 정상적으로 수신하고 처리합니다. 
: 송신하는 클라이언트는 50 ms 주기로 1ms 정도의 오차를 가지고 송신하는 것을 확인했습니다. 
: 제가 생각하기에는 수신 버퍼에 데이터가 들어와서 잡혀 있다가 한 번에 처리하는 것 같습니다.
: 클라이언트가 PC일 경우에는 데이터 크기를 4096 바이트로 늘리면 50 ms 통신 주기를 유지할 수 있다는 것을 확인했습니다만, 
: 보드에서는 4096바이트 데이터를 보내는 것이 불가능하네요.
: 그래서 PC에 있는 서버에서 무엇인가 작업을 해줘야 할 것 같은데,
: 머리털 나고 처음으로 소켓 프로그램을 작성하다 보니
: 뭘 어떻게 해야 할지 모르겠습니다.
: 소켓 프로그램 고수가 계시면 제발 도와주세요.
: 작은 힌트라도 알려 주시면 많은 도움일 될 것입니다.
:
: 사용한 컴파일러는 Boland Developer Studio 2006이고
: 컴파일러에서 기본제공하는 서버소켓과 클라이언트소켓을 사용하였습니다.
:
: 미리 감사드립니다.

+ -

관련 글 리스트
54751 주기적으로 TCP 클라이언트에서 서버로 데이타 송신하는데 서버에서 수신 주기가 안 맞습니다. 기둥 1226 2008/10/04
54754     Re: 이렇게 한번 해보세요~ 설현도 1521 2008/10/04
54753     Re: aj주기적으로 TCP 클라이언트에서 서버로 데이타 송신하는데 서버에서 수신 주기가 안 맞습니다. 박영목 1304 2008/10/04
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.