Чтение сокетов и данные неизвестной длины - PullRequest
2 голосов
/ 22 января 2011

Я пытаюсь написать код на C, в котором я хочу прочитать данные из сокета, но я не знаю длины входящих данных. Я не контролирую отправителя данных.

Есть ли способ чтения чтения сокетов с неизвестной длиной?

Ниже приведен код, который я написал, но он висит в read().

static void
process_command ( int fd ) {
    fprintf ( stderr, "process_command\n" );
    char *buffer = ( char * ) malloc ( sizeof ( char ) * SIZE_TO_READ );
    int n  = 0;
    while ( 1 ) {
        fprintf ( stderr, "." );
        n = read ( fd, buffer, SIZE_TO_READ );
        fprintf ( stderr, "bytes read = %d \n", n );
        if ( n <= 0 || n == -1 )
            break;
        buffer = ( char * ) realloc ( buffer, n + SIZE_TO_READ );
    }
    char * p = strchr ( buffer, '\n' );
    if ( p ) *p = '\0';
    fprintf ( stderr, "-----> %s\n", buffer );
    if ( buffer ) free ( buffer );
}

fd в этом случае - FILENO_STDIN

Ответы [ 3 ]

5 голосов
/ 22 января 2011

Просто прочитайте некоторые блоки (буферы), пока он не вернет 0, или вы увидите, что в соответствии с протоколом конец данных.

2 голосов
/ 23 января 2011

Это необычно - не иметь ЛЮБОГО способа узнать, сколько байтов ожидать.Большинство протоколов имеют НЕКОТОРЫЙ способ указать длину данных или терминатор данных.Какой именно протокол вы используете?

1 голос
/ 23 января 2011

Передайте SOCK_NONBLOCK при вызове socket() (или вызовите fcntl() с O_NONBLOCK позже), чтобы сделать операции сокетов неблокирующими.Это приведет к сбою вызова read() с EAGAIN или EWOULDBLOCK (они фактически одинаковы), если нет данных для чтения (пока).

В качестве альтернативы, вы можете использовать select() для определенияданные готовы для чтения в конкретном сокете до фактического вызова read().

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