Как передать ссылку на byte [] в качестве буфера в System.Net.Sockets.Send (). Recieve () - PullRequest
0 голосов
/ 29 мая 2009

Я читал о различных проблемах управления памятью, которые имеют асинхронные сокеты .NET.

Есть только несколько ссылок, но, если вы перейдете по этой ссылке, вы получите их все: http://codebetter.com/blogs/gregyoung/archive/2007/06/18/async-sockets-and-buffer-management.aspx

* В основном 1007 *
когда сокет асинхронно отправляет / получает много маленьких байтов []
отправленные / полученные байты [] закреплены в памяти
приводит к фрагментации.

SO в целях создания диспетчера буфера: У меня есть управляемый буфер (byte [])

byte[] managedBuffer = new byte[1024];
// do stuff with managedBuffer;

как отправить этот байт [] в асинхронный метод сокета .BeginSend () по ссылке?

// I don't want to pass the VALUE to the method, but a reference
// to managedBuffer;
System.Net.Sockets.Socket.BeginSend(managedBuffer...(other params));

Ответы [ 4 ]

2 голосов
/ 30 мая 2009

Как указывает Ник, вы уже передаете его по ссылке, когда передаете byte[] методу. Однако использование метода ArraySegment, который вы нашли в документации, имеет свои преимущества; они в первую очередь позволяют избежать проблем фрагментации памяти, присущих закреплению буфера byte[] во время асинхронного вызова.

См. Мой ответ на: Как написать масштабируемый сервер на основе Tcp / Ip для получения более подробной информации.

2 голосов
/ 29 мая 2009

Массивы всегда передаются как ссылки (например, при передаче указателя).

2 голосов
/ 29 мая 2009

Массивы всегда передаются по ссылке, так что вы уже делаете это. Если вы используете сокет асинхронно, то вам нужно убедиться, что вы не используете managedBuffer, пока он находится в процессе.

1 голос
/ 29 мая 2009

Единственное, что BeginSend делает с байтовыми данными, это отправляет их в открытый сокет. После этого байтовый массив будет удален (в конце функции, или когда класс, в котором определен массив, будет удален), как и любой другой байтовый массив в .NET с помощью GC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...