2016-05-21 3 views
0

Я пишу приложение TCP-сервера в C++.Прочитайте системный вызов навсегда на Linux

Я пытаюсь прочитать строку один символ за раз из сокета, но системный вызов read() никогда не возвращается.

string buffered_reader::read_line() { 
    string str; 
    int i = 0; 
    char ch; 

    do { 
     int len = conn.read_from_conn((void*)&ch, 1); 
     if (len == -1) 
      throw string("Error reading from connection!"); 

     str += ch; 
    } while (ch != '\n'); 

    return str; 
} 

А вот функция

int connectionplusplus::read_from_conn(void *buffer, int buffer_len) { 
    return read(this->connfd, buffer, buffer_len); 
} 
+1

Используйте 'strace', чтобы проверить, какие системные вызовы сделаны. –

+0

Вы можете использовать 'read()' в режиме разблокирования, в зависимости от того, как вы открываете сокет. –

+0

Как насчет случая, когда read() возвращает 0? Убедитесь, что вы справляетесь с этим. Что делать, если другой конец не отправляет никаких данных? Тем не менее, существует много случаев, когда read() никогда не будет возвращаться, и единственный выход - сделать неблокирующий ввод-вывод и использовать тайм-аут при чтении данных. – nos

ответ

0

read_from_conn() Проблема в том, что connfd не была инициализирована.

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