Клиент получил:
Это происходит каждый раз, когда сервер отправляет более 512 байтов (т.е. символов). все после 511-го символа отсутствует.
Как я получаю:
boost::asio::streambuf receiveBuffer;
int bytesRead = boost::asio::read_until(m_socket, receiveBuffer, ';', err);
std::string data = boost::asio::buffer_cast<const char*>(receiveBuffer.data());
Как я отправляю (это на С#):
private static void Send(Socket handler, String data, StateObject state)
{
state.WriteDone.WaitOne();
// Add delimiter.
data += ';';
byte[] byteData = Encoding.ASCII.GetBytes(data);
Console.WriteLine(data);
handler.BeginSend(byteData, 0, byteData.Length, 0,
new AsyncCallback(SendCallback),
state);
}
private static void SendCallback(IAsyncResult ar)
{
try
{
StateObject state = (StateObject)ar.AsyncState;
// Complete sending the data to the remote device.
int bytesSent = state.WorkSocket.EndSend(ar);
state.WriteDone.Set();
Console.WriteLine("Sent {0} bytes to client.", bytesSent);
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
Почему все после 511-го отсутствует? В чем проблема?
ПРИМЕЧАНИЕ. Проблема заключается не только в том, что при добавлении не получен разделитель ;
. Если я попытаюсь увеличить сообщение, остальная часть сообщения (все после 512-го символа) будет потеряна.
Я думаю, что сервер отправляет данные в нескольких сегментах (каждый сегмент 512 байт). Поскольку сервер является асинхронным, после отправки первого незавершенного сегмента к потоку добавляется другой сегмент, а не остальная часть предыдущего. Как видите, я использовал AutoResetEvent WriteDone
для синхронизации записи, но, похоже, это не работает.
Есть ли способ увеличить размер сегмента? (Это может просто решить проблему, однако, если снова размер сообщений увеличивается, размер сегмента также должен расти, поэтому это может быть не очень хорошим решением).
Если требуется больше кода или информации, пожалуйста, спросите в комментариях. Спасибо.
Обновлять
Приложение работало на другой машине!
read_until
возвращает? Каково значениеbytesRead
? - person Some programmer dude   schedule 04.10.2020boost::asio::read_until
читается пока не достигает разделителя (в данном случае';'
), то есть не включено? Если выread_until
и разграничите'}'
, он не будет содержать'}'
. - person Fureeish   schedule 04.10.2020