#c #sockets #wxwidgets
#c #сокеты #wxwidgets
Вопрос:
У меня возникли проблемы с преобразованием того, что считывается из сокета в wxWidgets, в wxString. Я делаю так:
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''; // ensure null terminated
Я предполагаю, что вы используете сборку в Юникоде. Удалите /2, если вы не
Ответ №2:
Если под зависанием вы подразумеваете сбои, возможно, вам не хватает a
в конце переданной строки. Из того, что я знаю, wxString(wxChar*)
потребуется строка с нулевым завершением.
Комментарии:
1. Это не сбой, просто не завершающий выполнение, и я должен убить его с помощью ctrl-c. На самом деле происходит сбой при печати, а не при преобразовании в wxString.
2. В этом случае может помочь, если вы разместили серверную часть. Отсутствие
может привести к очень длинной строке, но я не уверен, что она действительно зависнет при ее печати.