Q&A

  • Socket.ReceiveText 엉키는 문제???
소킷프로그래밍에서요...

넌블럭킹을 사용합니다.



서버 소킷 리드 부분

==================================================================

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 함수의 호출에 관련된 내용을 알지 못한다는 생각을 하고 있습니다.



이러한 문제를 어떻게 생각하시는지 고수님의 자문을 부탁드립니다.

0  COMMENTS