Во-первых, я уверен, что вы знаете, но это всегда стоит повторить; TCP - это поток байтов. Он ничего не знает ни о каких «сообщениях» прикладного уровня, которые, как вы можете определить, существуют в этом потоке байтов. Все успешные вызовы сокетов Recv, будь то синхронные или асинхронные, могут возвращать любое количество байтов от 1 до размера предоставленного буфера.
Имея это в виду, вы должны действительно иметь дело с созданием сообщения (т. Е. Искать разделитель), прежде чем делать что-либо еще. Если вы не нашли разделитель, просто переиздайте чтение, используя тот же SocketAsyncEventArgs
, тот же буфер и установите смещение на то место, где вы сейчас находитесь, это будет считывать еще несколько данных в буфер, и вы можете еще раз взглянуть на разделитель после завершения следующего чтения ... В идеале вы должны отслеживать, куда вы в последний раз обращались при поиске разделителя в этом буфере, чтобы уменьшить повторное сканирование ...
Прямо сейчас вы этого не делаете, и ваше использование e.Buffer[e.Offset] == 255
завершится неудачей, если вы получите сообщение, которое приходит по частям, как вы могли бы ссылаться на любой байт в сообщении, если сообщение разбито на несколько чтений.