2011-04-28 2 views
2

나는 델파이에서 ADC standard protocol을 준수해야하는 프로그램을 만들고 있습니다. 이 프로토콜은 각 줄을 줄 바꿈 문자 (# 10 # 13 또는 sLineBreak)로 끝내도록 지정합니다. 문제는 개행 문자가 서버에서 프로그램으로의 이동에서 살아남지 못하는 것입니다. 소켓에서 데이터를 읽는 것만으로 모든 것을 하나의 거대한 라인으로 줄 수 있습니다. 프로그램이 TMemo 객체에 디버그 메시지를 표시하는 방식과 관련이 있다고 생각했지만 Pos (sLineBreak, Buf)는 항상 0을 반환합니다 (문자열을 찾을 수 없음을 의미).델파이에서 소켓에서 개행 문자 읽기

내 코드 :

procedure OnRead(Sender: TObject; Socket: TCustomWinSocket); 
begin 
    //read all the data from the socket 
    while Socket.ReceiveLength > 0 do 
    Buf := Buf + Socket.ReceiveText; 

    //use only complete lines 
    while Pos(sLineBreak, Buf) > 0 do begin 
    //parsing stuff 
    end; 
end; 

또한, 서버는 따라서 그들에 줄 바꿈으로 한 번에 모두를 보낼 수 있습니다, 다른 단계로 명령을 보낼 전체 소켓을 읽을 필요가 없습니다 소켓 읽기마다 하나의 명령을 가정하는 것과는 대조적입니다.

+2

소켓 읽기 당 하나의 명령을 절대로 가정해서는 안됩니다. TCP 패킷은 무작위 덩어리로 도착합니다. – mjn

답변

4

프로토콜 사양에 "개행 (코드 포인트 0x0a)이 각 메시지를 끝냅니다." 그것은 하나의 문자입니다. 델파이 구문에서는 #10 또는 #$a입니다.

Windows에서 sLineBreak에 대한 일반적인 값은 #13#10입니다 - 캐리지 리턴 후, 먼저 줄 바꿈을 온다. 시퀀스 #10#13은 내가 알고있는 플랫폼에서 줄 바꿈이 아닙니다.

캐리지 리턴이없는 줄 바꿈 문자 만 받기 때문에 모든 문자가 한 줄로 표시되고 TMemo은 두 문자가 한 줄로 끝나기를 기대하기 때문에 메모 컨트롤에 한 줄로 표시됩니다. 메모장에 유닉스 스타일의 텍스트 파일을로드 한 것과 같습니다.

+0

+1 멋진 U + 2014입니다. –

+0

일반적으로 @Remy가 아닙니다. 어떤 형식의 프로그램이 해당 형식을 생성하며 그렇게 할 때 올바른 것으로 간주됩니까? 일부 프로그램에서는 호환성 기능으로 사용할 수 있다고 생각합니다. –

+0

죄송합니다. 나는 쓰여진 내용을 잘못 읽었습니다. '# 10 # 13'이 아니라'# 13 # 10'으로 보았습니다. –

3

흠, 당신은 링크 페이지가 단단히 새로운 라인은 하나의 문자 인 메시지 구문에 명시 할 것 : 당신이 상태로 Windows에 두 문자입니다

eol ::= #x0a 

sLineBreak있다.

+0

@Andreas, BNF, 델파이가 아니라 –