2012-04-11 5 views
3

gprs를 통해 서버에 데이터를 보내는 장치가 있습니다.소켓에서 원시 데이터를 읽습니다.

var 
    s : string; 
    repeat 
     s:=s+acontext.Connection.Socket.ReadChar; 
    until acontext.Connection.Socket.InputBufferIsEmpty; 

이 더 나은가요 : 문제는 원시 데이터를 전송하고 나는 현재 내가 문자열을 읽기 위해이 같은 TIdHttpServer 뭔가 뭔가를 사용하고

을 읽기를 중지 할 수있는 내가 아는 없다는 것입니다 내 문제에 대한 해결책?

+1

어떤 프로토콜이 전송됩니까? 장치가 각 프로토콜 장치 후에 연결을 닫는가? –

+0

아니요, 저에게 명령을 보내려면 연결이 열려 있어야합니다. TCP/IP 기반의 맞춤 프로토콜인가요? – opc0de

+0

왜'AContext.Connection.Socket.ReadLn'을 사용하지 않습니까? – TLama

답변

3

TCP는 스트림 지향입니다. 프로토콜이 알려지지 않은 경우, 서버는 바이트 배열 (메모리가 문제가되지 않는 경우) 또는 파일 스트림으로 읽기를 시도 할 수 있습니다. 클라이언트가 정상적으로 연결을 끊으면 데이터가 '완료'됩니다. 불행하게도, 프로토콜이 알려지지 않은 경우, 서버는 클라이언트가 죽었거나 정상적으로 연결 해제되었음을 알 수 없습니다.

InputBufferIsEmpty는 (TCP) 버퍼에 데이터가있는 경우에만 표시되며 지연 시간에 따라 자주 발생하지만, 기내 바이트가 없음을 의미하지는 않습니다.

클라이언트 장치를 통해 알려진 문자열을 보내 프로토콜을 '리버스 엔지니어링'할 수 있습니다. 하지만 발신자가 블랙 박스 인 경우 많은 특수한 경우가있을 수 있습니다. 인코딩 또는 '이스케이프'문자 등을 생각할 수 있습니다.

0

자신 만의 프로토콜을 구성 할 수 있습니다.

몇 가지 아이디어가 있습니다 :

  1. 사용하는 특수 문자 또는 문자 콤보가 메시지의 끝을 정의합니다.
  2. 메시지 시작 부분에 메시지의 크기와 함께 고정 크기 필드가 추가됩니다.
관련 문제