저는 boost :: asio입니다. 메시지와 응답은 모두 패킹 된 구조체의 형태이며 구조체가 패킹됨에 따라 여기서 직렬화를 사용하지 않습니다. 나는 비슷한 질문과 모든 조언 직렬화를 보았지만 그것이 내가 찾고있는 것이 아닙니다 . tcp 연결 boost :: asio를 통해 이러한 구조체의 객체를 어떻게 전달하고받을 수 있습니까? 나는 부스트를 처음 사용하고 그것을 탐구하기 때문에 코드 예제가 많은 도움이 될 것입니다. 미리 감사드립니다.
예제 구조체 :
typedef struct {
MessageHeaderInComp MessageHeaderIn;
RequestHeaderComp RequestHeader;
uint32_t Username;
char Password[LEN_PASSWORD];
char Pad4[LEN_PAD4];
} __attribute__((packed)) UserLoginRequest;
"packed struct"가 실제로 POD (표준 레이아웃 및 사소한 구성 / 파괴 가능)라는 것을 의미하는 경우, 짧은 비트 직렬화 가능하면 구조체 가 버퍼 라고 말할 수 있습니다 .
실제로 다른 버퍼 / 표현으로 복사하고 버퍼를 사용할 필요가 없다고 결정할 수 있습니다. 간단 합니다. 객체를 버퍼로 조정하면됩니다 .
UserLoginRequest req;
write(socket_or_stream, boost::asio::buffer(&req, sizeof(req)));
read(socket_or_stream, boost::asio::buffer(&req, sizeof(req)));
수학을 피하려면 배열 선언을 사용하는 것을 선호합니다.
UserLoginRequest req[1];
write(socket_or_stream, boost::asio::buffer(req));
read(socket_or_stream, boost::asio::buffer(req));
물론 비동기 스트림이나 소켓에서도 async_*
변형을 사용할 수 있습니다 ( 버퍼의 수명이 항상 작업 완료까지 연장된다는 점을 감안 하면).
관련하여 POD 유형을 버퍼로 연속적으로 저장할 수 있습니다.
std::vector<UserLoginRequest> massLogin(123); // weird, but just for demo
write(socket_or_stream, boost::asio::buffer(massLogin));
read(socket_or_stream, boost::asio::buffer(massLogin));
이러한 종류의 비트 직렬화는 이식 할 수 없습니다. 나는 당신이 이것을 잘 알고 있고 신경 쓰지 않는다고 가정하고 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다