Ещё можно вызвать req.finishConnect(). Эта функция выдаст true только тогда, когда установится соединение. Если там ошибка будет, эта же функция ошибку эту выкинет. Очень удобно. Можно в цикле со слипом её вызвать и ждать, пока не установится. А потом уже читать можно будет.
Заявления, что "никогда такого не было", ложны. Такое было давно, минимум три года. Я безумно счастлив за тех, кому не приходилось сталкиваться с этой проблемой, но на самом деле нормально работающая геталка с интернета выглядит весьма сложнее, чем код от @Alex. Если делать по-простому, то вы в свою программу добавляете бесплатное состояние гонки. Что, как известно, дебажить очень весело и интересно.
Ещё замечание. Чтобы не нужно было в цикле нерационально расходовать процессорное время, лучше не слип делать, а event.pull("internet_ready"). Если совсем круто хочется, то можно даже event.pull("internet_ready", req.id()).
internet_ready — это сигнал, который посылается компьютеру, если на сокете появляются новые непрочтённые данные. Например, прочла прога сначала 5 байтов с сокета, а потом на него сервер ещё двадцать отправил — тогда-то и получит прога ивент этот и снова считать данные сможет.
Так как особо крутые кодеры могут жонглировать сразу десятью интернет-соединениями на одном компьютере, полезно фильтровать ивенты по идшнику соединения, как во втором варианте у меня.
P. S. Все эти функции доступны при создании соединения через компонент интернет-платы. Не через либу internet. Это предельно важно. Поэтому я советую всегда не юзать либу, а помучаться, но сделать нормальную считывалку через апи компонента.