"네트워크 바이트 순서"개념을 이해할 수 없습니다. 나는 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
컴퓨터의 "네트워크"또는 네트워크 스택은 전송하는 데이터에 대해 아무것도 모르는 경우 바이너리 BLOB 시퀀스를 앞뒤로 전달합니다. 프로그램에서 처리 할 수있는 데이터로 해석해야 할 때 * 프로그램에 문제가 발생합니다. 빅 엔디안 시스템이 리틀 엔디안 인 다른 시스템으로 수정되지 않은'int '를 보내면, 수신자는'int' 값이 전송 된 것보다 다른 것으로 생각할 것입니다. –
@Someprogrammerdude, 내 예제에서 (두 호스트 측면에서 바이트 순서 및 데이터 구조 정렬을 알고있는 경우)이를 고려하지 않을 수 있습니까? –
@VladimirBershov하지만 언젠가는이 실수가 문제가 될 수 있습니다. 어떤 경우 든 압축 프레이밍 프로토콜을 사용할 때 성능 및 유지 보수 이점을 볼 수 있습니다. Google의 프로토콜 버퍼는 무료로 사용할 수있는 프로토콜 중 하나입니다. –