도저히 해결 못해서 할 수 없이 도움을 요청합니다.
델파이의 문제 같기도 한데 ...
문제는 이런 겁니다.
보내는 쪽에서는 아래와 같이 For 문을 사용해서 100개의 Text를 보냅니다.
For Count := 1 to 100 do
XSocket.SendText('Message'+IntToStr(Count)+#10#13);
받는 쪽에서는 해당 메시지마다 Ack를 보냅니다.
OnReceive
YSocket.SendText('Ack');
그러면 누가 생각하건 간에 보낸쪽은 100개의 Ack를 받아야합니다.
그러니 현실은 그렇지가 못합니다.
받은쪽에서 조사를 해보니 보내는 메시지가 붙어서 도착을 하였습니다.
즉, Message1, Message2, Message3, Message4, ...이렇게 보내어져야 하는데,
Message1Message2, Message3, Message4Message5Message6Message7, Message8Message9, ... 처럼 Random하게 붙어서 보내어 집니다.
즉, 받는 입장에서는 아무리 빨리 도착을 해도 끊어져서 제대로 처리가 되는데,
보내는 입장에서는 아주 빨리 보내면 위와 같이 따로 끊어서 보낸 것이 대중없이 붙어서 가버립니다. 위처럼 For 문으로 하지않고
XSocket.SendText('Message'+IntToStr(1)+#10#13);
XSocket.SendText('Message'+IntToStr(2)+#10#13);
XSocket.SendText('Message'+IntToStr(3)+#10#13);
...
이렇게 해도 마찬가지입니다.
이제 분명해진건 SendText가 받는 사람의 입장에서 하나의 OnReceive Event를 발생시키지 않는다는 것입니다.
제가 하고 싶은건 하나의 Text를 보낼때 받는 쪽의 입장에서도 정확히 그 Text를 받아 보는 것입니다.
물론 천천히(1초에 한번 정도 SendText를 실행) 보낼때는 SendText가 하나의 단위로 끊어 집니다.
아주 빨리 보내더라도 Text가 붙어 버리지 않게 보내는 방법이 없을까요?
Disk Cache의 경우에는 Flush라는 강제적인 명령이 있는데 Socket 송신 Buffer에 대해서 그런 행동을 하겠끔 하는 메커니즘은 없는가요?
--------------------------------------------------------------------------------
참고로
위의 상황에서 Socket은 Blocking Type이 아닙니다. NonBlocking Type이며 저는 NonBlocking Type에서 위와 같은 일을 하고 싶습니다.
Blocking Type은 안정적이지만 좀 비효율적이라 저는 사용치 않습니다.
그리고 위와같은 문제는 Blocking Type으로 해도 똑같이 발생할걸로 생각이 됩니다.
아래 분의 말씀처럼 TCP/IP의 본질적인 문제는 아닙니다.
그리고 저는 원격으로 가동할 수 있는 컴퓨터가 4대나 됩니다. 그런 작업은 윈도우2000서버의 터미널 서비스(PCAnywhere 써본 사람은 그것과 같다라는 걸 알겁니다)를 통해 가능하죠. 4대 모두 지역적으로나 Routing Hop을 봐도 많이 떨어져 있지죠. 즉 Local 테스트가 아니라는 말입니다.
제가 다시 델파이의 도움말을 자세히