我正在使用:HawkNL库。
有一个nlRead程序如下:
function nlRead(socket: NLsocket; var buffer; nbytes: NLint): NLint;
在所有示例和其他资源中,使用静态数组来读取字节。 就像这样:
FBufArray = array [0..1024] of Byte;
我对此事有几个问题。
哪种模型/类型适合我满足nlRead函数 为读取数据动态分配空间?
我试图使用Pointer和GetMem或使用SetLength的动态表,但它似乎没有按预期工作。
当我必须以未知速度读取字节并尽可能快地执行时,正确的方法是什么。我的意思是例如buffor的大小应该是多少?
对我而言,它是相关的,因为读取字节我必须同时重新发送。
一般情况下,我如何尽可能快地读取和发送字节?
答案 0 :(得分:4)
如果你的问题是作为'缓冲'传递什么。你可以传递任何你喜欢的东西。 如果你传递一个指针,你必须取消引用它。例如,当您调用nl Read
时Procedure read;
Type
TChunk = record
data: pointer;
datasize: NLint;
End;
Var
Chunk: TChunk;
Const
IdealReadSize = 1024;
Begin
GetMem( Chunk.data, IdealReadSize);
Try
Chunk.datasize := nlRead( YourSocket, Chunk.data^, IdealReadSize );
// Chunk.datasize hold the count of bytes which have been effectively read
// (maybe less than 1024 in case of an error)
// do something with your chunk
Finally
Freemem( Chunk.data, IdealReadSize );
End;
End;
这与TStream.Read()过程的方法相同。
答案 1 :(得分:3)
您可以使用无类型指针:var P: Pointer;
,使用GetMem
或AllocMem
进行分配,将其传递给已解除引用的函数nlRead(Socket, P^, Count);
并使用FreeMem
取消分配。
关于速度,静态缓冲区足够大:Buf: array[0..BufSize - 1] of Byte
可能是最好的。