Чтение wxWidgets из сокета

#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. В этом случае может помочь, если вы разместили серверную часть. Отсутствие может привести к очень длинной строке, но я не уверен, что она действительно зависнет при ее печати.