Я собираюсь предположить, что вы разработали свой собственный протокол и ожидаете дейтаграммы заранее известного размера и хотите защитить себя от мошеннических пакетов.
Поскольку производительность, похоже, является проблемой, и вы хотите избежать исключений, я бы посмотрел на перегрузку для Receive , которая возвращает необработанную ошибку сокета вместо выдачи исключений . Документация MSDN (неправильно?) Заявляет, что этот метод тоже вызовет исключение, но я не думаю, что это так. Это определенно стоит попробовать.
SocketError error;
byte[] buffer = new byte[512]; // Custom protocol max/fixed message size
int c = this.Receive(buffer, 0, buffer.Length, SocketFlags.None, out error);
if (error != SocketError.Success)
{
if(error == SocketError.MessageSize)
{
// The message was to large to fit in our buffer
}
}
Используйте буфер с заранее известным размером в здравом уме и используйте перегрузку, чтобы проверить код ошибки SocketError, чтобы определить, было ли чтение успешным или вы должны отбросить пакет.
Если, однако, ваш собственный протокол может отправлять дейтаграммы неизвестного размера вплоть до предела максимального размера дейтаграммы, у вас нет другого выбора, кроме как выделить буфер, достаточно большой, чтобы вместить самый большой пакет (65 КБ) (вы можете использовать пул буферов для избегайте проблем с памятью в зависимости от вашего кода).
Также ознакомьтесь с перечислением SocketFlags , в котором содержатся некоторые элементы, которые могут вас заинтересовать, например члены Partial и Peek.