2009-09-21 2 views
0

입니다. 저는 네트워크 프로그래밍에 새로운 것이므로, 이것이 완전한 초보자 용 질문이 아니기를 바랍니다. 우리는 포함하는 16 비트 정수를위한 공간을 예약 우리 QByteArray의 시작에서클라이언트에 대한 이점, 서버가 보낸 패키지의 크기는

QByteArray block; 
QDataStream out(&block, QIODevice::WriteOnly); 
out << (quint16)0; 
out << "..."; // just some text 
out.device()->seek(0); 
out << (quint16)(block.size() - sizeof(quint16)); 

:
나는 약간의 서버를 구축하는 방법을 Qt는-홈페이지에서 튜토리얼을 읽고, 나는 this 발견 우리가 전송하는 데이터 블록의 총 크기. [우리는 임의의 행운으로 계속해서 스트리밍합니다.] 그런 다음 QByteArray의 시작 부분으로 되돌아 가서 예약 된 16 비트 정수 값을 배열의 전체 크기로 덮어 씁니다. 이렇게하면 클라이언트가 전체 패킷을 읽기 전에 얼마나 많은 데이터를 기대할 수 있는지 확인할 수 있습니다.

그래서이 절차의 장점은 무엇입니까? 네가 그렇게하지 않으면 어떻게 될까? 어쩌면 작은 예제를 추가 할 수도 있습니다.

답변

2

표준 사항입니다.

수신 프로그램에 네트워크를 통해 오는 모든 것은 바이트 스트림입니다. 스트림은 응용 프로그램에 의해 정의 된 것 이상의 의미를 갖지 않습니다. 응용 프로그램이 레코드, 라인 등을 정의하는 것 이상의 의미가없는 것과 똑같은 방식입니다. 클라이언트와 서버가 스트림을 이해할 수있는 유일한 방법은 그들이 동의하는 컨벤션 또는 프로토콜을 설정하는 것입니다. 이러한 목표를 달성하기 위해

그래서 몇 가지 일반적인 방법으로 다음과 같습니다

  • (예 : 캐리지 리턴) 메시지의 끝을 지정하는 구분 기호를 가지고
  • , 당신의 예에서와 같이, 길이 필드를 통과하는 수신자에게 얼마나 많은 데이터가 다음 메시지를 구성 하는지를 알려줍니다.
  • 그냥 고정 된 규칙을 설정 (예 : 모든 메시지가 20 바이트 형 'A'레코드가 하나의 정의 된 형식이 될 것입니다 될 것입니다, 유형 B는 다른 기록 ...)
  • 단지로 스트림처럼 취급 (예를 들어, 네트워크를 통해 오는대로 받아 그것이 무엇인지에 모든주의를 기울이고하여 w/o 파일에 넣어) 전혀 규칙이없는 길이 바이트 방법의

장점 중 하나는 수신기가 정확히 을 알고있다 예상되는 데이터 양. 일부 정상 검사를 추가하면 응용 프로그램에서 버퍼 오버 플로우 등을 제거하는 데 도움이됩니다.

1

수신하기 전에 패킷 크기를 알면 성능이 향상됩니다. 그런 다음 힙이나 버퍼 관리에서 필요한 바이트 수를 정확히 할당하고 '네트워크 수신 기능'에 대한 거의 모든 (이상적으로 하나) 호출을 수신 할 수 있습니다. 크기를 잘 모르는 경우 메시지의 아주 작은 부분에 대해 '네트워크 수신 기능'을 호출해야합니다.

'네트워크 수신 기능'(recv() 또는 Qt가 제공 할 수 있음)은 TCP 버퍼 처리 등을 수행하는 시스템 호출이므로 느린 것으로 간주해야합니다. 호출 오버 헤드. 그래서 가능한 한 적은 전화해야합니다.

관련 문제