2010-07-26 6 views
0

내가 가진 문제는 printf가 클라이언트 응답에서 반환되는 모든 데이터를 인쇄하지 않는다는 것입니다. BOF의 가능성을 제거하면서 ...C++ printf 큰 버퍼

#define MAXBUFFER 24576 
char buffer[MAXBUFFER]; 
...... 
datastream = read(sock,buffer,MAXBUFFER - 1); 
printf("%s",buffer); 
...... 

콘솔에 모든 클라이언트 데이터를 인쇄하는 가장 좋은 방법은 무엇입니까 (검증 데이터는 패킷 스니퍼를 통해 다시 전송되는)?

+0

어떻게 데이터를 콘솔에 표시 하시겠습니까? –

+0

전송되는 데이터의 양과 표준 출력에서 ​​누락 된 데이터의 양은 얼마입니까? –

+0

마크 - 클라이언트가 전송하는 것과 정확히 일치합니다. 예 : (ps 출력) Dan - 반송되는 데이터의 양이 MAXBUFFER – ekronnenburg

답변

2

1)는 디스플레이 데이터를 얻기 위해 표준 출력을 플러시해야 할 수도 있습니다 : 데이터의 많은 거기 fflush(stdout);

2) 경우에, 당신은 아마 소켓에서 읽을 루프를 사용해야합니다. (이 경로를 거쳐야하는 경우 MAXBUFFER 값을 줄여야 할 수도 있습니다.)

참고 : 생산 코드는 개별 메시지의 끝을 수신 한 시점을 인식해야합니다. 길이 카운트, 또는 특정 종료 코드를 찾는 것, 또는 다른 수단. 여기에 표시되지 않았습니다. (당신이 길이 수를 사용하는 경우, 그것은 추적하기 위해 "bytesRead"의 값을 정리해 쉽게 충분하다.)

// Add a byte at the end to allow for a terminating null char 
char buffer[MAXBUFFER + 1]; 
buffer[MAXBUFFER] = '\0'; 
    //... 
    int bytesRead; 
    while((bytesRead = read(sock, buffer, MAXBUFFER)>0)) { 
     printf("%s", buffer); 
11

가능한 원인 :

  1. read

    모두를 읽을 보장되지 한 번에 데이터를 읽으려고 시도하기 때문에 읽은 문자의 수를 반환합니다.

  2. printf%s은 버퍼의 첫 번째 '\0' [ASCII 코드 0]이 인쇄 될 때까지 인쇄됩니다.

+0

문제는 클라이언트의 출력에 0이 포함되어 있습니다.이 문제를 해결하는 방법은 무엇입니까? – ekronnenburg

+0

또한 버퍼에 0이 포함되어 있지 않은 경우 CRASH – Will

+0

@ekronnenburg : 데이터가 바이너리 형식 인 것 같습니다 (바이트에는 인쇄 가능한 문자와 인쇄 할 수없는 문자가 혼합되어있을 수 있습니다). stdout으로 성공적으로 인쇄하기 전에 인쇄 가능한 형식으로 변환하십시오. –

11

버퍼에 0 바이트가 있으면 문자열 터미네이터로 처리됩니다. 이것은 ASCII 또는 바이너리 프로토콜입니까? 후자의 경우 인쇄하기 전에 16 진수로 변환 할 수 있습니다.

+0

+1. 이것이 제가 생각한 첫 번째 것입니다. 아마도 "0 바이트"라는 의미를 분명히해야합니다. –

+0

ASCII .... printf 버퍼가 0에 의해 어떤 방법으로도 죽었습니까? – ekronnenburg

+0

@ekronnenburg : 예. 짐이 말했듯이 먼저 16 진수로 인코딩합니다. +1. –

2
int numberofbytesread = read(sock,buffer,MAXBUFFER - 1); 
write(1, buffer, numberofbytesread); 

당신은 당신이 상태대로 데이터 '원시'보내려의 printf 대신 write(2)를 사용해야합니다. 댄에 대한 당신의 반응을 이해 한 것입니다.

+0

필자는 쓰기를 사용했으며 printf와 동일한 동작을 보이는 – ekronnenburg

+0

OK를 사용했습니다. 나는 더 이상 문제가 무엇인지 확신 할 수 없다. 더 자세하게 얘기해 주 시겠어요. 몇 개의 문자를 읽었습니까? 즉, read()의 반환 값은 무엇입니까? 그리고 printf() 또는 write()에 의해 몇 개의 문자가 인쇄됩니까? 이 두 함수는 쓰여진 문자의 수를 반환합니다. –

0

요구 사항을 이해하려면이 예제를 사용하십시오. Ans By의 : 사용 쓰기()는 0과 데이터 또는

#include<iostream> 

using namespace std; 

int main() 
{ 
    int ret=0,i; 
    char buf[25470]; 

    for(i=0;i<25470; i++) 
    { 
     buf[i] = 'a'; 
    } 

    buf[2500] = 0; 

    ret = printf("%s ", buf); 
    printf("\n \n Printed using 'printf' = %d \n \n", ret); 

    ret = write(1,buf,sizeof(buf)); 
    printf("\n \n Printed using 'write' = %d \n \n", ret); 

    return 0; 
} 

'\ 0'을 그리고 당신이 정말로 "추신 보조"와 같은 명령을 보내려면이 큰 버퍼가 필요하다면?

+0

사용하는 중 쓰기 (1, 버퍼, sizeof (버퍼)); 여전히 쓰기를 사용하여 중단됩니다. 원격 시스템의 "ps aux"출력의 예 루트 4682 0.0 0.0 0 0? S ekronnenburg

관련 문제