소킷프로그래밍에서요...
넌블럭킹을 사용합니다.
서버 소킷 리드 부분
==================================================================
procedure Tfrm_ChatServer.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
bufferReceive : string; // Socket.Receive 총 버퍼
TxtReceive : string; // 전체 버퍼중 1회 분량 string
cPos : integer; // 1회 분량중 메시지 끝
begin
inc(temp);
bufferReceive := Socket.ReceiveText;
while True do begin
cPos := pos(CR,bufferReceive);
TxtReceive := copy(bufferReceive,1,cPos-1);
Process_Receive(TxtReceive,Socket);
bufferReceive := copy(bufferReceive, cPos+2, length(bufferReceive));
if length(bufferReceive) < 20 then break;
end;
memo1.lines.add(inttostr(temp));
end;
==================================================================
이와 같이 클라이언트는 메시지를 볼넬때 메시지의 끝을 CR/LF를 첨가하하여
서버가 받을때는 CR의 위치를 분석하여 하나의 메시지를 끊어주는 방식을 사용합니다.
그리고 메시지 처리 함수인 Process_Receive에 인자로 주고 호출하는방식을 사용합니다.
그러나 클라이언트에서 한번에 연속해서 보내게 되면 메시지가 붙어서 처리됩니다.
그러나 위의 함수에서 각 라인마다 memo1.lines.add 같은 함수를 사용하는 등의 시간을 소비하게 되면 메시지를 잘 처리합니다.
또한 현제 함수의 첫부분과 끝부분에 전역변수인 Temp값을 가지고 이 함수가 몇차래 호출되었가를 확인해 보면 While 루프 회수만큼 나옵니다.
그러나 루틴상 While 밖에있는 inc(temp)가 연산되고 화면에 출력한다는 것 자체를 이해하지 못하고 있습니다.
저 나름대로의 생각에는 제가 ServerSocketClientRead 함수의 호출에 관련된 내용을 알지 못한다는 생각을 하고 있습니다.
이러한 문제를 어떻게 생각하시는지 고수님의 자문을 부탁드립니다.