2010-07-26 3 views
0

Проблема, с которой я столкнулась, - printf не печатает все данные, которые возвращаются из ответа клиента. (Проверено данные передаются обратно через анализатор пакеты)C++ printf большой буфер

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

Каков наилучший подход к печати всех клиентские данных на консоль ... устраняя потенциал кислородного конвертера?

+0

Как вы хотите, чтобы данные отображались на консоли? –

+0

Сколько данных отправлено и сколько не хватает на stdout? –

+0

Mark - точно, как клиент отправляет его. например (выход ps) Dan - сумма данных, которые отправляются обратно, меньше MAXBUFFER – ekronnenburg

ответ

2

1) Вы, возможно, придется смывать стандартный вывод, чтобы получить данные для отображения: fflush(stdout);

2) Если есть много данных, то вы, вероятно, необходимо использовать цикл для чтения из сокета. (Если вы идете по этому маршруту, вы, вероятно, можете уменьшить значение MAXBUFFER, а не то, что вам обязательно нужно.)

Примечание: производственный код должен также распознавать, когда был получен конец дискретного сообщения - с помощью подсчет длины или поиск определенного кода завершения или некоторые другие средства. Это не показано здесь. (Если вы используете счетчик длины, достаточно легко суммировать значения «прочитанных байт», чтобы следить.)

// 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

Если в буфере есть нулевые байты, они будут рассматриваться как ограничители строк. Является ли это ASCII или двоичным протоколом? Если последнее, вы можете захотеть конвертировать в шестнадцатеричный текст перед печатью.

+0

+1. Это было первое, о чем я думал. Должно, вероятно, уточнить значение «нулевые байты». –

+0

ASCII .... буфера printf убивается 0 любыми подходами к этому? – ekronnenburg

+0

@ekronnenburg: Да. Как сказал Джим, сначала кодируйте сначала шестую. +1. –

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

Вы должны использовать write(2) вместо Printf, как Вы заявляете вы хотите отправить «сырые» данные. Это мое понимание твоего ответа на Дэн.

+0

Я использовал запись и ее выставляю то же поведение, что и printf – ekronnenburg

+0

OK. Должен признаться, я больше не уверен, в чем проблема. Можете быть более конкретными. Сколько символов читается? Т.е. каково возвращаемое значение из read()? И сколько символов напечатано printf() или write()? Обе эти функции возвращают количество написанных символов. –

0

Используйте этот пример, чтобы понять требования. Ans: Использование записи(), если у вас есть данные с 0 или «\ 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; 
} 

И вам действительно нужен этот большой буфер для отправки команды, как «PS AUX»?

+0

Использование write (1, buffer, sizeof (buffer)); Он все еще ломается, используя запись Пример вывода «ps aux» с удаленной машины root 4682 0.0 0.0 0 0? S ekronnenburg

Смежные вопросы