2011-10-27 3 views
0

У меня возникают проблемы с преобразованием того, что читается из сокета в wxWidgets, в wxString. Я так делаю:wxWidgets reading from socket

wxChar * readBuffer = new wxChar[256]; 
wxSocketClient * connection = new wxSocketClient(); 
connection->Connect(addr, true); 
connection->Read(readBuffer, 256); 
wxString wasRead(readBuffer); 
std::cout << wasRead.mb_string() << std::endl; 

Он продолжает болтаться при печати строки, есть ли лучший способ сделать это?

ответ

1

Ваш readBuffer может не иметь нулевого завершения. Фактически, он может содержать только частичное сообщение.

Простейших «исправить», чтобы гарантировать, что нуль

Вы можете использовать LastCount(), чтобы определить количество прочитанных байт.

Однако реальное решение заключается в том, чтобы установить простой протокол между вашим сервером и клиентом, чтобы вы могли определить, когда было получено все сообщение, и только затем распечатать его.

connection->Read(readBuffer, 255);  // leave room for null terminator 
readBuffer[connection->LastCount()/2] = L'\0';  // ensure null terminated 

Я предполагаю, что вы используете сборку юникода. Удалите/2, если вы не

0

Если вы повесили трубку, вы можете пропустить \0 в конце вашей переданной строки. Из того, что я знаю, wxString(wxChar*) возьмет строку с нулевым завершением.

+0

Его не сбивает, просто не заканчивая выполнение, и я должен убить его с помощью ctrl-c. На самом деле это не удается при печати без преобразования в wxString. – csteifel

+0

В этом случае это может помочь, если вы разместили серверную часть. Отсутствие '\ 0' может привести к очень длинной строке, но я не уверен, что на самом деле это будет _hang_ при ее печати. – Vlad