那位大哥帮忙看一下我程序的问题?急呀!!(50分)

  • 主题发起人 主题发起人 h_o_u_l_i
  • 开始时间 开始时间
H

h_o_u_l_i

Unregistered / Unconfirmed
GUEST, unregistred user!
我照书做了个SOCKET的程序,分为客户端和服务端,他们可以相互收发文本信息。
下面语句为客户端Tclientsocket的onread事件:
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
re:pchar;
sbuf:string;
relong:integer;
begin
re:=nil;
while socket.ReceiveLength>0 do
begin
re:=allocmem(socket.ReceiveLength);//问题1:去掉此句可否?
try
relong:=socket.ReceiveLength;
socket.ReceiveBuf(re^,socket.ReceiveLength);//问题2:re是pchar,已是指针为什么还加^,这是什么意思?不成了指针的指针了?
  //为什么有时不加^也行?(测试成功)
sbuf:=strpas(re); //问题3:此句改为sbuf:=re;后测试不行,收到的信息结尾处总是有乱码?
setlength(sbuf,relong); //问题4:此句写上有什么意义?可是不写收到的信息结尾处总是有乱码?

totallen:=totallen+relong;
statusbar1.Panels.Items[1].Text:='总共接收:'+inttostr(totallen);
statusbar1.Update;
finally
freemem(re);
end;
memo1.Lines.Add(sbuf);
end;
end;
您可以会几个就帮忙回答几个先谢......谢.......了!
 
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
re:pchar;
sbuf:string;
relong:integer;
begin
re:=nil;
while socket.ReceiveLength>0 do
begin
re:=allocmem(socket.ReceiveLength);//问题1:这句话不能去掉,这句话的作用是根据收到数据的长度,分配内存
try
relong:=socket.ReceiveLength;
socket.ReceiveBuf(re^,socket.ReceiveLength);//问题2:re^表示re指向的字符这个^加不加都没问题的Delphi会处理的
sbuf:=strpas(re); //问题3:此句改为sbuf:=re;跟strpas()函数是不相等的,要实现sbf := re还要写其他代码,就是在re后面加一个#0
setlength(sbuf,relong); //问题4:这是修改sbuf的长度,使之符合收到的字符数

totallen:=totallen+relong;
statusbar1.Panels.Items[1].Text:='总共接收:'+inttostr(totallen);
statusbar1.Update;
finally
freemem(re);
end;
memo1.Lines.Add(sbuf);
end;
end;
 
to Tassadar:
pchar类型的变量声明后用使用allocmem()分配内存空间吗?
以前使用pchar类型的变量时从没分配过内存空间呀?是否是编写socket时必须这么做?
 
pchar只是一个指针而已,跟所有的指针一样,都只是一个四个byte的内存地址而已
指针可以指向已经分配的内存地址比如
var
S : String[10]
pS : pchar;
begin
pS := @S[1];
end;
这里就是把pS指向一个已经分配给S的内存的地址
另外一种情况就是用new或者allocmem函数向系统申请内存
 
接受答案了.
 
后退
顶部