菜鸟捉虫(2)
软件世界
上期正确答案:
上期在编译的时候,StrPCopy(TranChar[0],Copy(szText,i,1));这一句无法通过编译,原因是类型不匹配。StrPCopy函数的第一个参数应该PChar类型的,而TranChar[0]是Char类型,所以程序会报错。将TranChar[0]改成@TranChar[0]即可通过编译。另外,在程序中还有一个程序不会报错的错误,那就是忽略了资源的释放,前面使用了GetMem分配了内存空间,在不使用的时候应该即时释放资源,这里使用FreeMem(TranChar,1)释放所分配的内存空间。在编写程序的时候一定要养成即时释放资源的好习惯。
获奖名单:
重庆 张勇
江西 康爱群
湖南 傅笑
北京 秦锋
河南 任子峥
以上获奖读者将获得电脑报最新出品的《电脑报系列配套光盘杂志》一套。
本期题目:
下面是Delphi中服务端/客户端的部分源代码,使用的是UDP协议进行通信,但目前的问题是,服务端无法与客户端进行连接,请大家找找BUG在哪儿?
{服务端部分代码}
unit Server_unit;
……
procedure TfrmMain.CmdConnetClick(Sender: TObject);
//与客户端进行连接
var
sReq:Array[0..255] OF Char;
begin
sUDP.RemoteHost:=127.0.0.1;
sUDP.RemotePort:=5701;
sUDP.LocalPort:=5000;
//发送连接请求,如果客户收到连接请求信息,则向服务端发送连接成功的信息
StrpCopy(sReq,'req');
frmMain.Caption:='正在连接 ...';
sUDP.SendBuffer(sReq,Length(sReq));
end;
procedure TfrmMain.sUDPDataReceived(Sender: TComponent;
NumberBytes:Integer; FromIP:String; Port:Integer);
var
gMsg:Array[0..255] OF Char;
begin
//接收客户端发来的消息
sUDP.ReadBuffer(gMsg,NumberBytes);
if gMsg[0] + gMsg[1] + gMsg[2]='#ok' then frmMain.Caption:='Yeah!连接成功!';
end;
{客户端部分源代码}
unit Client_unit;
……
procedure TfrmMain.FormCreate(Sender: TObject);
begin
Application.ShowMainForm:=False; //隐藏窗体
end;
procedure TfrmMain.FormShow(Sender: TObject);
begin
gUDP.RemotePort:=5701;
gUDP.LocalPort:=5000;
end;
procedure TfrmMain.gUDPDataReceived(Sender:TComponent;
NumberBytes:Integer; FromIP:String; Port:Integer);
var
getMsg,sMsg: Array[0..255] OF Char;
begin
gUDP.ReadBuffer(getMsg,NumberBytes);
if getMsg[0] + getMsg[1] + getMsg[2] ='req' then
beign
//收到服务端发来的连接请求消息后向服务端发送连接成功的消息
StrpCopy(sMsg,'#ok');
gUDP.RemoteHost:=FromIP;
gUDP.SendBuffer(sMsg,Length(sMsg)) ; //发送信息
end;