2013-10-07 6 views
1

나는 데이터를 수신하고 작은 확인 패킷을 돌려 보내는 서버로 앉아있는 델파이 프로그램을 가지고있다. 나는 이전에 클라이언트가 (나의 통제하에) 좋아하지 않는, 전송 거의 라인 CRLF의 끝을 추가 그렇다, 잘 작동이 (간결성을 위해 편집)이 코드델파이 7과 인디 9는 TCP 서버로부터 데이터를 쓰고있다.

procedure TdmServer.OnExecuteTCPServer(AThread: TIdPeerThread); 
var 
    IncomingPacket : string; 
    ResponsePacket : string; 
begin 
    IncomingPacket := AThread.Connection.Readln(#$03); 

    if IncomingPacket <> '' then 
    begin 
    ResponsePacket := ProcessTelegram(IncomingPacket); 

    AThread.Connection.writeln(ResponsePacket); 
    end; 

    AThread.Connection.Disconnect; 
end; 

을 사용했다.

그래서 나는 그것을 변경 :

AThread.Connection.Write(ResponsePacket); 

아무것도는 클라이언트에서 수신되지 않습니다.

그때 나는 시도하고 즉시 쓸 얻을
AThread.Connection.WriteBuffer(ResponsePacket, length(ResponsePacket), true); 

을 시도,하지만 여전히 전혀 보내지 않습니다.

나는 지연을 넣고, 버퍼를 열어 플러시하고 다시 닫았다 (도움말 파일과 같이). 그러나 여전히 기쁨이없고 FlushWriteBuffer가 호출 될 때마다 나는 AV를 얻는다.

막혔습니다. 누구든지 지혜의 말씀을 드릴 수 있습니까?

답변

1

ReadLn()은 결과에서 종결자를 제거합니다. 그게 당신의 ProcessTelegram()입니까? ResponsePacket는 클라이언트가 기대하는 것을 제대로

ProcessTelegram(IncomingPacket + #03) 

를 포맷하는 :는 터미네이터를 필요로하는 경우, 당신은 예를 들어, 수동으로 다시 추가해야합니다? 클라이언트가 종료 CRLF를 예상하지 않으면 WriteLn() 대신 Write()을 사용하는 것이 올바른 일입니다. 클라이언트가 여전히 수신되지 않는 경우

WriteBuffer(PChar(ResponsePacket)^, Length(ResponsePacket), True) 

:

WriteBuffer(ResponsePacket[1], Length(ResponsePacket), True) 

또는 : 당신이 WriteBuffer()를 사용하는 경우

, 당신은 순서대로 문자열 역 참조 WriteBuffer()에 예를 올바른 데이터 주소를 통과해야한다 응답을 올바르게 보낸 다음 아무 것도 보내지 않거나 클라이언트가 예상하는 종료자를 보내지 않습니다. Wireshark와 같은 패킷 스니퍼를 사용하여 클라이언트가 실제로 무엇을 수신하는지 확인하십시오.

+0

감사합니다. Remi, 나는 문자열을 역 참조 할 필요가있었습니다. 이제 제대로 작동합니다. – Kate