2013-12-23 2 views
1

저는 UDPSocketClient와 함께 Delphi XE4를 사용 중이며 서버에 요청을 보냅니다. 요청은 성공적이지만 서버에서의 응답은 항상 약 200 바이트입니다. 약 1000 바이트 여야합니다.UDPSocketClient.Receiveln이 들어오는 모든 데이터를 처리하지 못합니다.

나는 이유가 무엇입니까?! EOL 휴식이나 그와 같은 것이 없습니다.

청크로 읽을 수 있습니까?

procedure TForm1.SendCommand(const Pass, ACommand: string); 
var 
Cmd: string; 

begin 
    if UDPSocketClient.Connected then 
    begin 
    Cmd := Pass + ' ' + ACommand; 
    UDPSocketClient.Sendln(AnsiString(Cmd)); 
    Memo1.Lines.Add(''); 
    Memo1.Lines.Add('######################'); 
    Memo1.Lines.Add(ACommand); 
    Memo1.Lines.Add('######################'); 
    Memo1.Lines.Add(''); 
    end; 
end; 

procedure TForm1.BtnSendCmdClick(Sender: TObject); 
var 
    Buff: AnsiString; 
    received: string; 
begin 

    if Assigned(CurrentServer) and (CmdEdit.Text <> '') and 
    (CmdEdit.Text <> CmdEditPlaceHolder) then 
    begin 
    SendCommand(CurrentServer.Password, CmdEdit.Text); 
    end; 
    try 
    received := String(UDPSocketClient.Receiveln(Buff)); 
    Memo1.Lines.Add(received); 
    finally 
    CmdEdit.SetFocus; 
end; 
+0

서버 코드를 표시 할 수 있습니까? 아마 서버가 여러 개의 데이터 그램을 전송하고 있습니다 .. 또한 코드가 tx/rx 비트 – Roddy

+0

주위에'begin ... end;'가없는 것처럼 보입니다. 복사 및 붙여 넣기시 손실 된 코드가 수정되었습니다. 서버는 공백이있는 1000 바이트 정도의 문자열을 전송합니다. 서버 소스가 없습니다. –

+0

아무 것도 보내지 않아도받는다면 ..? 이상하게 보입니다. – Roddy

답변

0

나는 TUDPSocket을 사용하고 있다고 가정합니다.

ReceiveLn의 매개 변수는 delimiter string to search for입니다. Buff이 비어있는 문자열이기 때문에 비헤이비어가 정의되지 않을 수 있습니다.

+0

어떻게 구현할 수 있습니까? –

+0

@JanW. 그냥 버프를 버리십시오. 디폴트는 개행 순서입니다. – Roddy

+0

그것은 작동하지 않습니다. 200byte 정도만받을 수 있습니다. 데이터 길이가 200byte가 넘으면 메모에 아무 것도 표시되지 않습니다. 나는 TUDPSocket 자체에 의해 SocketBuffer가 관리되고 있다고 생각한다. TStringlist로 완전한 소켓 버퍼를 읽을 수 있습니까? –

0

이제 솔루션에 접근합니다.

  1. 들어오는 UDP 데이터 패키지는 200bytes보다 작은 모든 것이 올바른 것입니다 : 내가 서버에 명령을 보낼 때

    는 데이터를 수신 할 두 possibilitys있다.

  2. 들어오는 UDP 패키지가 1.3kb에 도달하면 소켓 버퍼에 두 개의 udp 패키지가 있습니다. 하지만 내 응용 프로그램에 패키지를 가져올 수 없습니다.
관련 문제