2013-11-30 1 views
0

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

У меня есть что-то вроде этого:

if (select(maxfd + 1, &fdlist, NULL, NULL, NULL) < 0) { 
    perror("select"); 
} else { 
    if (FD_ISSET(listenfd, &fdlist)) { 
     newclientconnection(); 
    } 

    // see which clients have activity 
    for (p = head; p; p = p->next) { 
     if (FD_ISSET(p->fd, &fdlist)) { 
      // want to read all lines from client 
      while ((n = read(p->fd, p->buf + lastindex, MAX-p->lastindex) > 0) { 
       p->lastindex += n;   
      } 
      if (n==0) { 
       removeclient(p); 
      } 

      // want to process all the lines 
      process(p->buf); 
    } 
} 

ответ

1

Вы блокирующим в этой строке:

while ((n = read(p->fd, p->buf + lastindex, MAX-p->lastindex) > 0)) 

На последней итерации while Cond. ждет ввода от read. но вход уже прочитан. поэтому, ожидая нового ввода.

Если предположить, что вы Гон получить данные больше, чем буфер (поэтому вы положили read в while состоянии), необходимо определить тайм-аут (select и т.д.) для readИЛИ определяет специальный символ ("\ г \ п \ г \ n ", например), чтобы определить" это конец данных ". В противном случае цикл while будет ждать навсегда для получения дополнительных данных.

+0

Или сделать файловый дескриптор неблокирующим с O_NONBLOCK? –

+0

@JonathanLeffler Конечно! есть несколько вариантов, поэтому я написал «и т. д.». – MeNa