2014-06-23 2 views
0

두 개의 프로세스가 소켓을 통해 통신하도록 가능한 한 간단하게 프로토콜을 작성하려고합니다. 원시 데이터에서 제어 명령을 분리하고 싶습니다. 이것을 어떻게 얻을 수 있습니까? 내 말은, 소켓이 단지 바이트 스트림을 전송한다면, 내 프로토콜은 예를 들어 이스케이프 시퀀스 "ESC STX"를 숫자 시퀀스 2734와 구별 할 수 있습니까? 나는이 문제를 해결하는 방법을 아직 찾지 못했기 때문에 약간은 찾았지만 충분하지는 않습니다.이스케이프 시퀀스를 관리하는 방법은 무엇입니까?

미리 감사드립니다.

+3

프로토콜 버퍼 또는 다른 인코딩 체계를 살펴보십시오. 길이 인코딩 값 및 유사한 인코딩에 대해서는 위키피디아를 참고하십시오. – Soren

+0

"이제 길이가 X 인 데이터를 보냅니다"와 X 바이트 길이의 데이터 . – nwp

+1

이스케이프 시퀀스가 ​​페이로드에 나타날 때 이스케이프 시퀀스가 ​​이스케이프 처리 된 이유입니다 (대개 0x25 사용). –

답변

1

가장 쉬운 해결책은 2 개의 연결을 열 수 있습니다.

하나의 포트/연결은 제어 명령 (메타 데이터) 용이고 다른 연결은 데이터 용입니다.

2 개의 연결을 사용할 수없는 경우 데이터를 "메시지"로 나눌 수 있습니다.

각 메시지에는 메시지 헤드와 메시지 본문이 있습니다. 메시지 헤드에는 다음 필드가 포함되어 있습니다. (= 몸의 바이트 수 다음 메시지의 시작 부분 식별하는 데 필요한)

  • 메시지 바디 길이를
  • 메시지 유형 (도주를 구별하기를 및 실제 데이터와 같은 시퀀스)

메시지 헤드의 길이가 알려져있는 이유 때문에 수신자는 수신되는 데이터의 유형을 항상 알고 있습니다. 그러나 헤더에 일종의 체크섬 필드를 추가해야합니다. 그냥 특별한 바이트를 정의

탈출

(예. 0x00)는 이스케이프 문자가 될 수 있습니다. 이스케이프 시퀀스 (ESC STX)를 전송할 때마다이 바이트를 보내기 전에 전송합니다.

그러나 데이터를 0x00으로 보내려면 두 번 보내야합니다. 수신기는 일부 교체에에 있습니다

  • 0x00

    0x00 다음에 -> 더 이스케이프 시퀀스. 1 바이트를 제거하면 모든 것이 정상입니다.
  • 0x00 다음에 다른 바이트가 오는 경우 0x00 바이트를 제거하십시오. 두 번째 바이트는 이스케이프 시퀀스이며 특별한 의미가 있습니다.
4

메시지 설정 프로토콜. 예를 들어

: 페이로드는 고정 크기이기 때문에 페이로드는 임의의 패턴을 포함 할 수

+---------+-----------+----------+ 
| Command | Payload | Checksum | 
| 2 bytes | 252 bytes | 2 bytes | 
+---------+-----------+----------+ 

.가변 길이의 메시지

는 메시지 길이가 추가되어야

+---------+----------------+-----------+----------+ 
| Command | Message Length | Payload | Checksum | 
| 2 bytes | 2 bytes  | ? bytes | 2 bytes | 
+---------+----------------+-----------+----------+ 

페이로드 길이는 메시지 길이 필드의 크기에 의해 결정된다.

관련 문제