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);
}
Используйте 'strace', чтобы проверить, какие системные вызовы сделаны. –
Вы можете использовать 'read()' в режиме разблокирования, в зависимости от того, как вы открываете сокет. –
Как насчет случая, когда read() возвращает 0? Убедитесь, что вы справляетесь с этим. Что делать, если другой конец не отправляет никаких данных? Тем не менее, существует много случаев, когда read() никогда не будет возвращаться, и единственный выход - сделать неблокирующий ввод-вывод и использовать тайм-аут при чтении данных. – nos