Вам нужно читать до тех пор, пока ваш буфер не будет заполнен следующим образом:
unsigned readLen = 0;
unsigned totalLen = sizeof(recBuffer);
while (readLen < totalLen) {
int ret = read(socket_fd, recBuffer + readLen, totalLen - readLen);
if (ret > 0) {
readLen += ret;
} else {
// error handling here
break;
}
}
Это необходимо, потому что read()
возвращает только имеющееся в настоящее время количество байтов, которое может быть меньше, чем вы запрашивали. Из соответствующей man-страницы :
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
В случае успеха возвращается количество прочитанных байтов (ноль указывает на конец файла), и положение файла увеличивается на это число. Не является ошибкой, если это число меньше числа запрошенных байтов; это может произойти, например, потому что на самом деле сейчас доступно меньше байтов (возможно, потому что мы были близки к концу файла, или потому что мы читаем из канала, или из терминала), или потому что read () была прервана сигнал.
Если вам нужно получить несколько ответов, вы можете поместить описанный алгоритм в функцию и использовать его повторно. В любом случае вам нужно знать, сколько ответов ожидать, в противном случае ваш read()
будет блокироваться, поскольку кажется, что сервер вашего телевизора запрограммирован на поддержание открытого соединения, и клиент сам должен выбрать, когда отсоединяться.
Если вы решили сделать ваше приложение более изощренным, вы можете использовать один из механизмов IO Multiplexing , чтобы ваше ожидание ответа прерывалось таймером или входом терминала. Например:
while (true) {
pollfd fds[] = {
{ socket_fd, POLLIN, 0 },
{ STDIN_FILENO, POLLIN, 0 }
};
int ret = poll(fds, sizeof(fds) / sizeof(*fds), -1);
if (ret > 0) {
if (fds[0].revents & POLLIN) {
readResponse(); // read and process response
}
if (fds[1].revents & POLLIN) {
break; // exit on terminal input
}
}
}