문제

네트워크 응용 프로그램의 경우 동적 데이터를 전송하는 방식은 구조물을 (void*)로 구성하는 것입니다. 이것은 std :: string에이를 수행 할 때와 같은 몇 가지 문제를 제기합니다. 문자열은 역동적 인 길이 일 수 있으므로 다른 쪽은 문자열이 끝날 때 어떻게 알 수 있습니까? 내가 가진 아이디어는 Java의 DataUputStream과 유사한 것을 사용하는 것이 었습니다. 여기서 변수를 전달할 수 있고 (void*)에 넣을 수 있습니다. 이 작업을 수행 할 수 없다면 시원합니다. 나는 단지 구조물을 memcpying하는 것을 정말 좋아하지 않습니다. 그것에 대해 뭔가 옳지 않은 것 같습니다.

감사,
로비

도움이 되었습니까?

해결책

구조물에 memcpy에 아무런 문제가 없습니다. 동적 변수를 거기에 넣으면 다르게 시리얼링해야합니다.

std :: 문자열이있는 구조물이있는 경우 스트림 연산자를 만들어 버퍼를 포맷하는 데 사용하십시오. 그런 다음 데이터 전송에 해당 버퍼를 Memcpy 할 수 있습니다. 부스트가 있으면 사용하십시오 부스트 :: 직렬화 이 모든 것을 당신을 위해 수행합니다 (링크는 대체 직렬화 LIB에 대한 링크가 있습니다).

참고 : 가변 크기 버퍼를 전달하는 일반적인 방법은 길이를 보내고 많은 바이트의 데이터를 보내는 것입니다. 때때로 당신은 구분기가 수신 될 때까지 데이터가 전송되는 것을 볼 수 있습니다 (그리고 해당 데이터 내의 필드는 다른 캐릭터, 즉 쉼표로 구분됩니다).

다른 팁

이 질문의 두 부분이 있습니다 .- 네트워크를 통한 데이터의 직렬화 - 구조를 네트워크 스택으로 전달하는 방법

네트워크를 통해 데이터를 직렬화하려면 프로토콜이 필요합니다. 어려울 필요는 없습니다. ASCII의 경우 패킷 끝과 같은 CR/LF조차도. MFC와 같은 프레임 워크를 사용하는 경우 직렬화 기능을 제공 할 수 있습니다. 이 경우 패킷으로 보내는 방법에 대해 걱정해야합니다. 나에게 잘 작동하는 패킷 화는 다음과 같습니다.

<length><data_type>[data....][checksum]

이 경우 체크섬은 선택 사항이며, 예를 들어 신호가 data_type (예 : ACKLNOWEDGEMENT의 ACK)에 운반되는 경우 제로 데이터가 가능합니다.

구조로 memcpy에서 작업하는 경우 Memcpy가 얕은 사본 만 만든다는 것을 고려해야합니다. 포인터는 네트워크를 통해 전송되면 쓸모가 없습니다. Instand 해당 포인터에서 데이터를 전송해야합니다 (즉, 문자열 예제의 내용).

네트워크에서 동적 데이터를 보내려면 다음 옵션이 있습니다.

동일한 패킷의 첫 번째 옵션.

void SendData()
{
   int size;
   char payload[256];

   Send(messageType)
   Send(size);
   Send(payload)
}

두 번째 옵션 :

void SendData()
{
   char payload[256];

   Send(messageType)
   Send(payload)
}

어느 상황에서도, 당신은 더 많은 디자인 선택에 직면하게 될 것입니다. 첫 번째 예에서는 메시지 유형과 페이로드 크기 및 페이로드를 보냅니다.

두 번째 옵션은 메시지 유형을 보낼 수 있고 NULL 터미네이터의 구분 기가있는 문자열을 보낼 수 있다는 것입니다.

두 옵션 중 어느 쪽이든 내가 생각하는 문제를 완전히 다루지는 않습니다. 첫째, 게임을 구축 할 것인지 결정해야합니다. TCP? 두 번째로 직면 할 문제는 최대 패킷 크기입니다. 그 외에도 프레임 워크가 있어야하는 프레임 워크가 있어야하는 최적의 패킷 크기를 계산하여 파편화되어 인터 웹에서 손실 될 수 있습니다. 그 후에는 클라이언트와 서버간에 전송하고 수신 할 수있는 데이터의 양과 관련하여 대역폭 컨트롤이 있습니다.

예를 들어 대부분의 게임 이이 상황에 접근하는 방식은 각 패킷이 다음과 함께 식별됩니다.

MessageType
MessageSize
CRCCheckSum
MessageID
void buffer[payload]

동적 데이터를 보내야하는 상황에서는 하나뿐만 아니라 일련의 패킷을 보냅니다. 예를 들어, 파일을 보내는 경우 네트워크가 네트워크에 발생하는 경우 스트리밍 프로토콜이고 전체 스트림이 다른 쪽 끝에 안전하게 도착하는 것이기 때문에 TCP/IP를 사용하는 최상의 옵션입니다. 반면에 UDP는 패킷 기반의 프로토칼이며 모든 패킷이 순서대로 또는 다른 쪽 끝에 도착했는지 확인하지 않습니다.

결론적으로.

  1. 동적 데이터의 경우 여러 패킷을 보내지 만 특수 플래그를 사용하면 더 많은 데이터 가이 메시지를 완료하기 위해 도착하는 것이 좋습니다.
  2. 간단하게 유지하고 C ++로 작업하는 경우 패킷이나 데이터에 NULL 터미네이터가 포함되어 있다고 가정하고 NULL 터미네이터를 사용하기로 결정한 경우 페이로드와 비교하여 크기를 확인하십시오.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top