|
저 또한 이런 문제로 고민 중인데요..
일단은 ServerSocket에서 Read Event가 뜨면 그 이벤트의 종료가 되기 전에는
다시 Read Event가 뜨지 않는 것으로 알고 있습니다.
그 동안 소켓에 들어오는 데이터는 소켓 내부 버퍼에 저장될 것이고, 소켓 버퍼에 Full이
나면 TCP/IP 메커니즘에 의해 송신측에 더 천천히 데이터를 보내라고 할 것입니다.
따라서, 트랜잭션이 길면 길 수록 수신 버퍼가 무쟈게 차 버리는 현상이 발생하는데..
이러면 서버 소켓의 전체적인 속도가 현저하게 떨어집니다.
이런 경우, 소켓에서 읽어 들이는 부분과, 이를 처리하는 프로세서 부분을 서로 스레드로
처리하면서 동기화 메커니즘을 이용해서 처리하는 것이 올바를 것으로 생각됩니다.
제가 제작하려는 것은 소켓의 수신 묘듈과 처리 모듈을 스레드로 만들고 중간에 버퍼를
두고(TQueue같은) ... TEvent와 같은 동기화 객체를 이용해서 두 개의 스래드를 동기화
시키면서 처리하는 좋은 것으로 생각됩니다. (지금 그렇게 구현 안되어 있는데..그렇게 하
려고 예정입니다. )
답이 늦었네요.. 좋은 결고 있으시길..
하안인 님이 쓰신 글 :
: tcp/ip로 데이타를 전송하는 경우에
: 데이타를 받은후 그 데이타를 가지고 퀴리를 해야 할경우 그 퀴리하는 시간이
: 5초정도 걸린다고 가정하면 그 안에 다시 데이타가 전송되어 왔을때
: 그 데이타를 받아들일수 있나요..
:
:
: void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
: TCustomWinSocket *Socket)
: {
: .....
: 이부분에서 데이타를 퀴리해서 다시 재전송해야 할경우
: ...
: }
:
: 위 작업이 끝나기 전에 소켓은 데이타를 받은 경우 그 데이타값을 큐같은 곳에 저장해서
: 끝난 다음에 실행되는지....
:
: 백업쓰레드로 돌려야 하는것인지...
:
: 도움을 구합니다.
|