struct ss {int data; string name;} * o;C++을 사용하여 Windows 플랫폼에서 소켓 통신 구조를 보내는 방법
이것은 클라이언트 응용 프로그램의 내 구조입니다. 나는 그것을 서버 (TCP 서버의 Windows에서)로 보내려고합니다. 그 방법 .. 나는 serilization이 해결책임을 안다. 하지만 할 수있는 방법을 모르겠다. 도와주세요.
struct ss {int data; string name;} * o;C++을 사용하여 Windows 플랫폼에서 소켓 통신 구조를 보내는 방법
이것은 클라이언트 응용 프로그램의 내 구조입니다. 나는 그것을 서버 (TCP 서버의 Windows에서)로 보내려고합니다. 그 방법 .. 나는 serilization이 해결책임을 안다. 하지만 할 수있는 방법을 모르겠다. 도와주세요.
http://www.parashift.com/c++-faq-lite/serialization.html
당신은 직렬화 부스트를 사용하는 경우 다음이 Serialize and send objects by TCP using boost
내가 일반적으로이 데이터를 전송하기 위해 내 자신의 데이터 형식을 쓰기 읽어 보시기 바랍니다.
문자 버퍼를 만듭니다.
패킷의 크기를 넣습니다. 정수를 바이트로 변환하고 복사하십시오. 문자열 길이를 추가하십시오 이름을 복사하십시오.
먼저 클라이언트와 서버가 항상 동일한 아키텍처인지 여부를 알아야합니다. 이는 단지 data
을 그대로 보낼 수 있는지 여부 또는 엔디안과 정수의 크기를 신경 써야하는지 여부를 결정합니다. 어쨌든 ntohl
과 htonl
은 바이트 순서를 처리하고 사용자가 이미 정의 된 방식 (이미 네트워크 바이트 순서 인 컴퓨터에서는 작동하지 않음)으로 int
을 전송할 수 있습니다.
string
에 대해 문자열 데이터가 양쪽 모두 동일한 인코딩으로되어 있다고 가정하면 TCP를 통해 크기와 내용을 모두 잘 전달할 수 있습니다 (크기를 htonl
으로 변환). "일반, 불가지론 자 "UTF-8과 같은 인코딩이 항상 사용됩니다.
양쪽 끝의 컴퓨터에서 사용하는 인코딩을 모르는 경우 문제가 있습니다. 이 경우 은에이를 정의하고 이에 따라 변환하는 메시지가 포함되어야합니다 (예 : 웹 서버와 유사).
TCP가 "정상 모드"로 작동한다는 것은 Nagle의 알고리즘이 활성화됨을 의미하므로 send
에 3 번의 호출을 사용할 수 있으며 네트워크 계층은이를 합리적인 수의 패킷으로 압축합니다. 개별 패킷을 단지 정수로).
예를 들어 간단한 예제의 경우 을 사용하거나 적절하게 일련 번호를 지정할 수 있습니다., 물론 더 많은 작업이 필요합니다.
이것은 매우 좋은 안내서입니다. : 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
// 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
어려움에서
은 다른 끝입니다! 수령인은 읽어야 할 바이트 수와 그 안에 저장할 구조를 알아야합니다.
이러한 문제를 처리하기 위해 고유 한 코드를 작성하거나 소켓 상단에서 작동하는 프로토콜을 사용해야합니다. 이 코드는 어렵지는 않지만 이용 가능한 많은 프로토콜 중 일부에 대한 경험은 잡았다가 도움이 될 것입니다!
나는 그 일을 htonl과 ntohl했다. – Dharma