2012-05-21 3 views
1

저는 cgi를 통해 바이너리 파일 (예 : mp3 파일)을 제공하려고 노력해 왔습니다. 요점은 웹 서버 자체가 아닌 특수 스크립트를 통해서만 파일에 액세스 할 수 있도록하려는 것입니다. 지금까지 내가 가지고 :C++ cgi 파일 스트리밍

int main() { 
    cgiWriteEnvironment("/CHANGE/THIS/PATH/capcgi.dat"); 
    cgiHeaderContentType("audio/mpeg"); 

    FILE *fp; 
    fp=fopen("D:/something.mp3", "r"); 
    char buffer[4]; 

    while (!feof(fp)) { 
     fread(buffer, 4, 1, fp); 
     printf("%x",buffer); 
    } 


    return 0; 
} 
stdout에 뭔가를 태우고 및 브라우저 (그래서 헤더 ... 정확해야) VLC를 열려고하지만 선수

:-(데이터를 처리 할 수 ​​

+2

16 진수가 아닌 2 진수를 써야합니다. fwrite를 사용하십시오. 또는 C++을 사용하고 있으므로 스트림 경로를 사용할 수 있습니다. 또한 4 개의 문자보다 큰 버퍼가 있어야합니다. 낮은 수준의 버퍼링은 대부분의 패널티를 처리해야하지만 거대한 파일을 펌핑하는 경우에는 4 char 버퍼가 작습니다 (8MB 파일은 fread에 2m 호출이 필요합니다). – Corbin

답변

1

.mp3 파일을 16 진수, ASCII 0 및 4s 및 Cs 등의 시퀀스로 인코딩하면 fwrite()을 입력하면 작성중인 바이트의 원래 형식이 보존됩니다. 4 바이트가 작동하지만 4k (4048) 또는 8k (8192) 바이트를 대신 사용하는 것이 좋습니다. 현대 컴퓨터에서는 문제가되지 않지만 fread()에 대한 호출은 (상대적으로) 느려서 가능한 적은 수로 만들고 싶습니다. .

기타 : 이것은 매우 이상한 일입니다. 어떤 문제를 해결하려고합니까? 그리고 왜 일반 웹 서버가 그것을 해결할 수 없습니까?