2017-09-06 15 views
0

"네트워크 바이트 순서"개념을 이해할 수 없습니다. 나는 Network byte order and endianness issues을 읽었지만 여전히 할 수는 없습니다.
이제 TCP 소켓을 통해 두 컴퓨터 간의 통신을위한 공식 네트워크 프로토콜 설명을 만들었습니다. 다음은 "... 리틀 엔디안 바이트 순서 사용"구문입니다. 그러나 표준 네트워크 바이트 순서는 빅 엔디안입니다.네트워크 바이트 순서에 대해 생각해야합니까?

네트워크의 양면에서 바이트 순서가 완전히 정의되어 있고 대략적으로 말하면, 과 size을 쓰면 바이트 순서에 대해 생각해야합니까? 네트워크가 내 데이터를 어떻게 알 수 있습니까? float 유형은 무엇입니까?

stream.setDevice(tcpSocket); 
stream.setByteOrder(QDataStream::LittleEndian); 
... 

struct SomeType 
{ 
    int32_t a; 
    int32_t b; 
    double c; 

    friend QDataStream& operator << (
     QDataStream& stream, const SomeType& x) 
    { 
     stream << x.a 
      << x.b 
      << x.c; 

     return stream; 
    }   
}; 

하거나 할 수있다 :

SomeType x; 
tcpSocket.write(&x, size); // If known a byte order and a data structure alignment on both sides 
+2

컴퓨터의 "네트워크"또는 네트워크 스택은 전송하는 데이터에 대해 아무것도 모르는 경우 바이너리 BLOB 시퀀스를 앞뒤로 전달합니다. 프로그램에서 처리 할 수있는 데이터로 해석해야 할 때 * 프로그램에 문제가 발생합니다. 빅 엔디안 시스템이 리틀 엔디안 인 다른 시스템으로 수정되지 않은'int '를 보내면, 수신자는'int' 값이 전송 된 것보다 다른 것으로 생각할 것입니다. –

+0

@Someprogrammerdude, 내 예제에서 (두 호스트 측면에서 바이트 순서 및 데이터 구조 정렬을 알고있는 경우)이를 고려하지 않을 수 있습니까? –

+1

@VladimirBershov하지만 언젠가는이 실수가 문제가 될 수 있습니다. 어떤 경우 든 압축 프레이밍 프로토콜을 사용할 때 성능 및 유지 보수 이점을 볼 수 있습니다. Google의 프로토콜 버퍼는 무료로 사용할 수있는 프로토콜 중 하나입니다. –

답변

2

32 비트 값이 리틀 엔디안으로 표현 (인텔 등) : 내 측면 상에 기록 할 수 있는지, 예를 들어

,

address offset 0 1 2 3 bits 0-7 bits 8-15 bits 16-23 bits 24-31


그리고 네트워크 바이트 순서 또는 빅 엔디안 표현 (모토로라의 CPU 등) :

address offset 0 1 2 3 bits 24-31 bits 16-23 bits 8-15 bits 0-7


하나는 만들 것이다 (당신이 한 경우) 처음 컴퓨터 코드를 작성 배운 아키텍처에 따라 다른 사람보다 너에게 더 의미가있다. 45 세 미만의 거의 모든 사람들은 네트워크 바이트 순서의 반대 인 리틀 엔디안입니다. (!) :

당신이 그것을 때문에 텍사스 ​​- 땅에서 더욱 혼란 나 같은 텍사스 TMS9900 아키텍처를 기계 코드를 작성하는 것을 배웠다 경우

0은 최상위 비트


업데이트입니다 비트

일반적으로 하드웨어 또는 컴파일러 구현 선택 또는 언어와 독립적 인 방식으로 데이터를 와이어에 인코딩하는 것이 좋습니다.

여기 https://developers.google.com/protocol-buffers/docs/encoding

장점은 :

  1. 일반적 적은 트래픽이 너무 빨리 전달

  2. 각 단부 네트워킹 여기

    Google의 프로토콜 버퍼로부터 이러한 인코딩의 예 연결의 하드웨어, 컴파일러 버전 또는 관계없이 데이터를 이해합니다 언어.

+0

그러나 내 경우는 어떻습니까? 호스트 측에서 바이트 순서와 데이터 구조 정렬을 알고 있다면 명확하게 정의 할 수 있습니까? –

+0

@VladimirBershov 그러면 코드가 특정 하드웨어에 연결됩니다. 시간이 지남에 따라 하드웨어가 변경됩니다. 10 년 후에도 코드 작업을 원하십니까? –

+0

하지만'int'를'int32_t'로 바꾸면 어떨까요? 그리고 어떤 경우 든 부동 소수점 값을위한 해결책이 없습니다 –

1

TCP 소켓은 전송되는 데이터의 엔디안 (endianness)에 전혀 신경 쓰지 않습니다. 따라서 개인 네트워크 프로토콜의 경우 원하는 바이트 순서를 사용할 수 있습니다. 프로토콜을 사용하는 모든 컴퓨터가 동일한 자연 바이트 순서를 갖는다면이 코드를 직렬화 순서로 사용하는 것이 좋습니다. 두 번째 예제와 같이 코드를 작성할 수 있습니다.