如何将一个byte []引用作为System.Net.Sockets.Send()中的缓冲区传递.Recieve()

时间:2009-05-29 15:34:12

标签: c# sockets memory-management

我一直在阅读.NET异步套接字所具有的各种内存管理问题。

只有少数几个链接,但抓住这个链接会让你全部: http://codebetter.com/blogs/gregyoung/archive/2007/06/18/async-sockets-and-buffer-management.aspx

基本上
当套接字异步发送/接收许多小字节[]的时 发送/接收字节[]被固定在存储器中 导致分裂。

为了创建缓冲区管理器的目的: 我有一个托管缓冲区(byte [])

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

如何通过引用将此byte []发送到套接字的异步.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 个答案:

答案 0 :(得分:2)

数组总是通过引用传递,所以你已经这样做了。如果您异步使用套接字,那么您需要确保在进行中时不使用managedBuffer。

答案 1 :(得分:2)

数组总是作为引用传递(比如传递指针)。

答案 2 :(得分:2)

如Nik所示,当您将byte[]传递给方法时,您已经通过引用传递了它。但是,使用您在文档中找到的ArraySegment方法有一些好处;它们主要是为了避免在异步调用期间固定byte[]缓冲区中固有的内存碎片问题。

有关详情,请参阅我对How to write a scalable Tcp/Ip based server的回答。

答案 3 :(得分:1)

BeginSend对字节数据的唯一作用是将其发送到打开的Socket。之后,字节数组将被放置(在函数的末尾,或者当定义数组的类被释放时),就像GC中的任何其他字节数组一样。