作者在 2007-07-06 19:14:00 发布以下内容
我认为, Delphi VCL提供的TWinSocketStream类接口Write的参数列表定义有问题.
本人在使用该接口向Socket发送数据时, 发现发送的数据不正确, 请看下面的描述性代码部分:
var
FSocketStream: TWinSocketStream;
DataBuf: TByteDynArray;
begin
SetLength (DataBuf, DataSize);
try
// Assume FSockSteam bound with somewhat sock before.
DataBuf[0] := $01;
DataBuf[1] := $02;
DataBuf[2] := $03;
DataBuf[3] := $04;
FSockStream.Write (DataBuf, DataSize);
finally
SetLength (DataBuf, 0);
end;
end;
"FSockStream.Write (DataBuf, DataSize)"这里会有问题, 实际上没有将我设置的数据发出. 但如果把上段代码中
var
FSocketStream: TWinSocketStream;
DataBuf: TByteDynArray;
......
修改成
var
FSocketStream: TWinSocketStream;
DataBuf: array [0..255] of Byte;
......
情况就大不一样了!
后来查看了VCL的相关文档, 发现这个Write()接口参数的是被定义成const Buf 无类型参数, 根据VCL文档中所说, 无类型参数传入时编译器会启动匹配数据类型, 而前面代码中DataBuf定义成动态数组显然不能被其识别, 既然如此何不将const Buf定义成PChar, PByte, 直接发送字节流, 岂不是更好更直观吗?
要知道为了找到这个问题, 我可是花了不少工夫. 最后的解决办法就是, 不用修改DataBuf的定义, 只将
FSockStream.Write (DataBuf, DataSize);
改为,
FSockStream.Write (DataBuf[0], DataSize);
就行了.