关于serversocket的onclientread事件的问题. ( 积分: 100 )

  • 主题发起人 主题发起人 doby_li
  • 开始时间 开始时间
D

doby_li

Unregistered / Unconfirmed
GUEST, unregistred user!
//服务端接收数据
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
s,sHex:string;
RcvLength:Integer;
i:Integer;
begin
RcvCount:=RcvCount+1;
RcvLength:=socket.ReceiveLength;
SetLength(s,RcvLength);
socket.ReceiveBuf(s[1],RcvLength); //此行的s[1]这里编译时出现警告信息.
memo1.lines.add('length='+IntToStr(RcvLength)+ ' str=('+s +')');

for i:=1 to RcvLength do
begin
sHex:=sHex+format('%.2x ',[ord(s)]);
end;
memo1.lines.add(IntToStr(RcvCount)+': '+sHex);
end;

现在的问题是:
这段代码在编译时在: socket.ReceiveBuf(s[1],RcvLength);这行出现警告信息:
[Warning] Unit1.pas(146): Unsafe code 'String index to var param'

我查了一下:socket的receiveBuf方法的声明是:
receiveBuf(var Buf;Count:Integer):Integer;
这里的第一个参数类型是:Buf型,而我声明的s是string型.
我就不知道要如何弄了.
(程序能够正常运行)
请问这里的代码应如何改,编译时才不出现这种警告信息.
 
用ReceiveText不就可以了

//下面是TCustomWinSocket.ReceiveText的实现过程
function TCustomWinSocket.ReceiveText: string;
begin
SetLength(Result, ReceiveBuf(Pointer(nil)^, -1)); //取要接收的长度
SetLength(Result, ReceiveBuf(Pointer(Result)^, Length(Result))); //接收到字符串
end;
 
在 block 模式下,是不可以用 ReceiveText 的,详细请看帮助,要用专门的流来读.
 
那请问,我要用receviebuf来读的话,上面的程序应当要如何改呢?
谢谢.
 
把Result 改成 S

SetLength(S, socket.ReceiveBuf(Pointer(nil)^, -1));
SetLength(S, socket.ReceiveBuf(Pointer(S)^, Length(S)));
 
hxy2002,你好.
我按你说的:
我把:
socket.ReceiveBuf(s[1],RcvLength);
这行改成你的:
socket.ReceiveBuf(Pointer(S)^, RcvLength);

编译时提示:[Warning] Unit1.pas(146): Unsafe type 'Pointer'
但能正常运行.
请问应如何改?
 
后退
顶部