2013-12-21 4 views
0

Я получаю строку и сохраняю ее во входном буфере. Это поток и строка могут быть неполными, поэтому я ищу последнюю STOP-строку, скопирую остальную часть (которая начинается в следующий блок) и добавляет данные из следующей доставки за скопированные данные.
В промежутке я делаю некоторые операции над входным буфером (например, memcpy). Должен ли я сделать копию входного буфера или я могу использовать input_buffer, который у меня есть?Получение данных из потока непрерывно и поток чтения

Некоторые люди говорили мне, что это не имело бы никакого смысла:

if (bytes_received == 0) { 
     continue; 
    } 

Но это поток. Если это не имеет смысла, как я могу заверить, что я буду постоянно получать данные?

char * strrstr(char *string, char *find, ssize_t len) 
{ 

    char *cp;  
    for (cp = string + strlen(string) - 4; cp >= string; cp--) 
    { 
    if (strncmp(cp, find, 4) == 0) 
    return cp+4; 
    } 
    return NULL; 
} 

int main (void) { 
    char * input_buffer = malloc(MAXLENGTH); 
    size_t restSize=0; 
    char * restP; 

    int socket_handle = reqData(subStr); 
    ssize_t bytes_received ; 
    for (;;) { 

    bytes_received = recv (socket_handle , input_buffer+restSize ,MAXLENGTH-1, 0) ; 

    input_buffer[bytes_received-1] = '\0'; 
    if (bytes_received == -1) { 
     printf ("-1 An error occured during the receive procedure \n") ; 
     return 0 ; 
    } 
    if (bytes_received == 0) { 
     printf ("0 An error occured during the receive procedure \n") ; 
     return 0 ; 
    } 
    restP = strrstr (input_buffer, STOP, 4); 
    if (restP == NULL) 
    { 
     restSize = 0; 
     continue; 
    } 
    restSize = strlen(restP);//MAXLENGTH - (restP - input_buffer) + 1; 
    processXML(input_buffer, restP, t); 
    strcpy(input_buffer, restP); 

    } 
    close(socket_handle); 
    free (input_buffer); 
    return 0 ; 
} 

ответ

2

Есть некоторые ошибки в коде:

  1. Здесь: input_buffer[bytes_received-1] = '\0'; вы не проверить, если bytes_recived -1 (вы позже). Кроме того, вы должны проверить, является ли оно 0, потому что отрицательный индекс для массива не разрешен. Я тоже сделаю это позже, поэтому просто переместите цитированную строку.

  2. Рассмотрите возможность использования функции strstr из string.h вместо strrstr. Даже если ваша реализация кажется прекрасной (и это хорошее упражнение, если это ее цель), рекомендуется использовать стандартные функции, так как они более безопасны, чем ваша реализация, что может скрыть некоторые ошибки, например.

  3. При вызове функции recv нет необходимости ожидать MAXLENGTH-1. MAXLENGTH тоже будет работать.

Теперь, чтобы ответить на ваш вопрос, это может быть полезно: recv() returns 0 не Как вы видите, когда RECV возвращает 0, то нет смысла в ожидающей больше.

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