2011-07-28 2 views

답변

2

http://www.parashift.com/c++-faq-lite/serialization.html

당신은 직렬화 부스트를 사용하는 경우 다음이 Serialize and send objects by TCP using boost

내가 일반적으로이 데이터를 전송하기 위해 내 자신의 데이터 형식을 쓰기 읽어 보시기 바랍니다.

문자 버퍼를 만듭니다.

패킷의 크기를 넣습니다. 정수를 바이트로 변환하고 복사하십시오. 문자열 길이를 추가하십시오 이름을 복사하십시오.

0

먼저 클라이언트와 서버가 항상 동일한 아키텍처인지 여부를 알아야합니다. 이는 단지 data을 그대로 보낼 수 있는지 여부 또는 엔디안과 정수의 크기를 신경 써야하는지 여부를 결정합니다. 어쨌든 ntohlhtonl은 바이트 순서를 처리하고 사용자가 이미 정의 된 방식 (이미 네트워크 바이트 순서 인 컴퓨터에서는 작동하지 않음)으로 int을 전송할 수 있습니다.

string에 대해 문자열 데이터가 양쪽 모두 동일한 인코딩으로되어 있다고 가정하면 TCP를 통해 크기와 내용을 모두 잘 전달할 수 있습니다 (크기를 htonl으로 변환). "일반, 불가지론 자 "UTF-8과 같은 인코딩이 항상 사용됩니다.
양쪽 끝의 컴퓨터에서 사용하는 인코딩을 모르는 경우 문제가 있습니다. 이 경우 에이를 정의하고 이에 따라 변환하는 메시지가 포함되어야합니다 (예 : 웹 서버와 유사).

TCP가 "정상 모드"로 작동한다는 것은 Nagle의 알고리즘이 활성화됨을 의미하므로 send에 3 번의 호출을 사용할 수 있으며 네트워크 계층은이를 합리적인 수의 패킷으로 압축합니다. 개별 패킷을 단지 정수로).

예를 들어 간단한 예제의 경우 을 사용하거나 적절하게 일련 번호를 지정할 수 있습니다., 물론 더 많은 작업이 필요합니다.

+0

나는 그 일을 htonl과 ntohl했다. – Dharma

0

이것은 매우 좋은 안내서입니다. : http://beej.us/guide/bgnet/output/html/multipage/index.html. 그것은 엄격하게 창문에 대한 것이 아니라 변경 사항은 매우 미미합니다.

기본적으로 데이터를 버퍼로 직렬화 한 다음 send 함수를 사용해야합니다. 소켓 식별자와 버퍼 등을 전달하십시오.SOCKET S __in

int send(

, CONST의 char * buf를 __in , __in INT 렌 __in의 INT 플래그 ); http://msdn.microsoft.com/en-us/library/ms740149(v=vs.85).aspx

0
// send some data to a socket 
send( 
    socket,  // the open socket 
    o,    // pointer to the data 
    sizeof(ss), // number of bytes 
    0);   // no special flags 

어려움에서

은 다른 끝입니다! 수령인은 읽어야 할 바이트 수와 그 안에 저장할 구조를 알아야합니다.

이러한 문제를 처리하기 위해 고유 한 코드를 작성하거나 소켓 상단에서 작동하는 프로토콜을 사용해야합니다. 이 코드는 어렵지는 않지만 이용 가능한 많은 프로토콜 중 일부에 대한 경험은 잡았다가 도움이 될 것입니다!