C ++ printf большой буфер - PullRequest
0 голосов
/ 27 июля 2010

У меня проблема в том, что printf не печатает все данные, которые возвращаются из ответа клиента.(проверенные данные отправляются обратно через анализатор пакетов)

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

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

Ответы [ 5 ]

11 голосов
/ 27 июля 2010

Возможные причины:

  1. read не гарантируется одновременное чтение всех данных, просто он пытается это сделать, поэтому возвращает количество прочитанных символов;

  2. printf с %s будет печатать до первого '\0' [ASCII code 0] в вашем буфере.

11 голосов
/ 27 июля 2010

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

2 голосов
/ 27 июля 2010
int numberofbytesread = read(sock,buffer,MAXBUFFER - 1);
write(1, buffer, numberofbytesread);

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

2 голосов
/ 27 июля 2010

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);
0 голосов
/ 27 июля 2010

Используйте этот пример, чтобы понять ваши требования. Ответ: Используйте write (), если у вас есть данные с 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"?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...