TCP와 UDP 통신을 시도하고 있는데 보통의 프로그램과는 특성이 많이 다르다는 느낌입니다.
프로그램의 동작이 예상대로 되지 않는 경우가 많네요.(물론 실력이 부족해서 그렇겠지만)
UDP 통신 중에 안풀리는 문제가 있어서 질문드립니다.
데이터를 연속으로 보내기 위해서 Indy UDP Client를 사용했습니다. 수신측은 Indy UDP Server를 사용했고요.
1. Client : 시작 버튼을 누르면 초기 접속을 위해 RQST로 시작하는 메시지를 보냅니다.
2. Server : OnUDPRead Event에서 RPLY로 시작되는 문자를 보냅니다(응답)
3. Client : Server의 RPLY 응답을 받고 SGNL로 시작하는 신호를 보내는 무한 Loop를 시작합니다.
4. Client : 정지 버튼을 누르면 송신이 중지되고 UDPClient.Active := false 가 됩니다.
여기서 이상한 점이 두가지 있는데
하나는 시작버튼을 누르면 3~4초 있다가 RPLY 응답을 받고 송신 무한 Loop를 시작합니다.
두번째는 중지 버튼을 누르면 중지되는데 다시 시작버튼을 누르면 송신 응답은 되는 듯한데 송신 무한Loop가 되지 않습니다.
이때 중지 버튼을 2~3번 누르고 다시 시작버튼을 누르면 송신Loop가 동작합니다.(2~3번이라는 것도 일정하지가 않습니다)
원인을 알려주시면 감사하겠습니다.
<송신 시작 버튼>
procedure TClientFrmMain.BitBtn3Click(Sender: TObject);
var
AMessage, BMessage : string;
begin
UDPClient.Active := true;
try
AMessage := 'RQST'+':'+'&'+':'+'&'+':'+ClientIP;
UDPClient.Send(AMessage);
Memo1.Lines.Add ('Sended first : '+AMessage );
BMessage := UDPClient.ReceiveString();
Memo1.Lines.Add ('Readed first: '+BMessage );
except
on E: Exception do MessageDlg ('Error while connecting:'+#13+E.Message,
mtError, [mbOk], 0);
end;
SendingLoop; // -> 송신 무한 Loop
end;
<서버 수신부>
procedure TServerFrmMain.UDPServerUDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
DataStringStream : TStringStream;
CMessage : string;
Header, HexaHigh, HexaLow, ClientIP, Reply : string;
iClientCode : integer;
begin
DataStringStream := TStringStream.Create('');
try
DataStringStream.CopyFrom(AData, AData.Size);
CMessage := DataStringStream.DataString;
DataAnalyze(CMessage, Header, HexaHigh, HexaLow, ClientIP);
if Header = 'RQST' then begin
Protocol.Lines.Add(TimeToStr(Time)+' : '+CMessage+' from '
+ ABinding.PeerIP+' on Port '+IntToStr(ABinding.PeerPort));
Reply := 'RPLY'+' from '+ UDPServer.LocalName + ' to '+ABinding.PeerIP;
ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, Reply[1], Length(Reply) );
Memo1.Lines.Add('Sended : '+Reply);
end
else if Header = 'SGNL' then begin
DataProcess(HexaHigh, HexaLow, iClientCode); //Data 처리부
end
else;
finally
DataStringStream.Free;
end;
end;
<송신 무한 Loop>
procedure TClientFrmMain.SendingLoop;
var
BMessage : string;
ii,jj : integer;
HexaHigh, HexaLow : string;
begin
While not IsCancel do begin
Application.ProcessMessages;
BMessage := 'SGNL'+':'+HexaHigh+':'+HexaLow+':'+ClientIP;
UDPClient.Send(BMessage);
IncomingMessages.Lines.Add ('Sended : ' +BMessage);
end; //while
end;
<송신 정지 버튼>
procedure TClientFrmMain.BitBtn4Click(Sender: TObject);
begin
IsCancel := Not IsCancel;
UDPClient.Active := false;
end;
IsCancel이 첫번째 중지될때 True로 바뀌고 끝이네요...
무한 루프를 정상적으로 동작시키실려면 송신시작번튼부분에서 루프돌기 전에 IsCancel을 False로 바꿔주셔야 정상적으로 돌겠죠...