cout
ожидает, что строка будет оканчиваться нулем. Поскольку вы просто читаете байты в буфер, а не завершаете их нулем в конце, cout
будет переноситься после конца прочитанных байтов и просто продолжит выгрузку памяти, пока не достигнет нулевого указателя или защита памяти срабатывает.
С вашим кодом происходит следующее:
- Вы назначаете 16-байтовую область памяти.
- Вы звоните InternetReadFile. Это помещает IP-адрес, скажем, «127.0.0.1» в ваш буфер, без нулевого терминатора.
- Вы звоните
cout
с DataReceived. Это массив символов, поэтому cout
ожидает, что это строка с нулевым символом в конце. Он выводит каждый символ с начала буфера, сразу после «127.0.01» и далее, пока не найдет 0 в памяти.
- Поскольку «127.0.0.1» - это все, что нужно прочитать, и ваш буфер был больше этого, следующий вызов InternetReadFile оставляет NumberOfBytesRead равным нулю, поэтому ваш цикл происходит только один раз.
Ничего не знаю о InternetReadFile()
, но я думаю, что такой подход должен работать, если вы берете только одну строку с IP-адресом в ней:
char DataReceived[64]; // I guess I'm antsy about having plenty of room
DWORD NumberOfBytesRead = 0;
if (InternetReadFile(OpenAddress, DataReceived, 63, &NumberOfBytesRead)) {
DataReceived[NumberOfBytesRead] = '\0';
cout << DataReceived;
} else // handle error condition
Но, по сути, я думаю, что основная проблема, с которой вы столкнулись, заключается в том, что вы путаете буфер, который представляет собой просто набор байтов, с приятной дружественной строкой с нулевым символом в конце, и вы должны это понимать, и, возможно, искать некоторые существующие примеры использования InternetReadFile с учетом этого, чтобы увидеть, как они работают, и, следовательно, что вам нужно сделать.