Сначала я объясню, почему это не работает, затем я внесу предложение по решениям. В основном вы найдете ответ в man-страницах man7.org> Linux> и для recv, в частности здесь .
Когда вызывается функция "recv", она не вернется, пока данные не станут доступны и могут быть прочитаны. Такое поведение функций называется «блокировкой». Значит, текущий поток выполнения блокируется до тех пор, пока данные не будут прочитаны.
Итак, вызывая функцию
n = recv(sock, &buffer[0], buffer.size(), 0);
как и вы, вызывает проблемы. Вам также необходимо проверить код возврата. 0 означает, что соединение закрыто, -1 означает ошибку, и вы должны проверить errno для получения дополнительной информации.
Вы можете изменить сокет для работы в неблокирующем режиме с помощью функции fnctl и флага O_NONBLOCK для времени жизни сокета. Вы также можете использовать флаг MSG_DONTWAIT в качестве 4-го параметра (флаги), чтобы разблокировать функцию для каждого вызова функции.
В обоих случаях, если данные недоступны, функции возвращают -1, и вам нужно проверить errno для EAGAIN или EWOULDBLOCK.
Возвращаемое значение 0 указывает, что соединение было закрыто.
Но с точки зрения архитектуры я бы не рекомендовал использовать этот подход. Вы можете использовать несколько потоков для получения и отправки данных или, используя Linux, одну из функций выбора, опроса или аналогичных функций. Для этого есть даже общий шаблон дизайна. Он называется «Реактор». Есть также похожие шаблоны, такие как «Acceptor / Connector» и «Proactor» / «ACT». Если вы планируете написать более надежное приложение, вы можете рассмотреть его.
Здесь вы найдете реализацию Acceptor, Connector, Reactor, Proactor, ACT здесь
Надеюсь, это поможет