2016-07-19 5 views
0

QIODevice::Write의 QT 문서는 말한다 :QTcpSocket :: write - 대용량 파일을 작성하는 방법?

qint64 QIODevice::write(const char *data, qint64 maxSize) 

장치에 데이터를 데이터의 대부분이 maxSize 바이트에 기록합니다. 실제로 쓴 바이트 수를 반환합니다. 오류가 발생하면 -1을 반환합니다.

하지만 온라인으로 발견 된 모든 코드 샘플은 다음과 같이를 사용하는 것 같다

QByteArray block; 
... fill the block... 
socket->write(block); 

또는 내가 큰 파일을

QByteArray block; 
... fill the block... 
auto written_bytes = socket->write(block); 
if(written_bytes < block.size()) 
    throw error().. 

가정하자 다음과 같이 (의 말을하자 2 GB) 첫 번째 또는 후자의 접근 방법을 사용해야합니까? TCP를 통해 단 하나의 청크에서 2GB를 전송할 수 있을지 의심 스럽습니다.

아니면 다음과 같은 것을 사용해야합니까?

QByteArray block; 
... fill the block with 2GB of data... 
auto written_bytes = 0; 
while(written_bytes < 2GB) { 
    // Restart each time where we previously left 
    written_bytes += socket->write(block + written_bytes, 2GB - written_bytes); 
} 

나는 당신이 합리적 크기의 청크 파일을 읽는 유지하고 소켓에 이러한 덩어리를 공급해야 할

+1

실용적인 TCP/IP 패킷 크기 (이더넷을 통한 MTU)는 약 1500 바이트이므로 데이터가 청크로 처리됩니다. 여러분에게 가장 분명하고 유지하기 쉬운 것을 적어보십시오. –

+0

오, 그렇다면 5-16 바이트의 작은 "핑 (ping)"을 말하자면 '쓰기'가 5-6 바이트를 쓸 수 없다면 오류를 던져야한다는 것은 절대적으로 안전합니다. – Dean

+1

비 블로킹 소켓을 사용하지 않는 한 읽기/쓰기가 차단됩니다. –

답변

2

매우 혼란 스러워요. 작은 크기의 오버 헤드로 소켓 스트리밍을 유지하기 위해 즉석에서 청크 크기를 조정할 수 있습니다. 즉, 낮은 전송 버퍼 워터 마크에 반응하는 코드가 초당 12 회 이상 활성화되어서는 안됩니다. 매우 큰 파일의 경우, 경우에 따라 초당 1 회 리필을 목표로하십시오.

예제 코드는 this answer을 참조하십시오.