UDP通讯问题,哪位大侠能帮我看看问题出在哪?

Description of your first forum.

UDP通讯问题,哪位大侠能帮我看看问题出在哪?

帖子ADV » 星期三, 2004年7月21日 08:53


DLL源码:
//初始化参数
procedure InitDll();
begin
 bIsLoaded := False;
 //创建UDP控件
 if not Assigned(IdUDPServerClient) then
   IdUDPServerClient := TIdUDPServer.Create(nil);
 with IdUDPServerClient do
 begin
   if (Active) then Active := False;
   //设置默认端口号
   DefaultPort := 10188;
   //设置广播
   BroadcastEnabled := True;
 end;
 ReceiveIP := '';
 //初始化定时间器
 if not Assigned(TimerClient) then
   TimerClient := TTimer.Create(nil);
 //创建myRunClass类  
 if not Assigned(myRunClass) then
   myRunClass := TMyClass.Create;
 //设置定时间事件
 with delphi.com/topic_517220_8bf9.htm">Time rClient do
 begin
   Enabled := False;
   Interval := 2000;
   OnTimer :=   myRunClass.RunTimer;
 end;
end;

//释放资源
procedure DestroyClient;
begin
 bIsLoaded := False;
 //停止记时
 if Assigned(TimerClient) then
 begin
   TimerClient.Enabled := False;
   TimerClient.OnTimer := nil;
   TimerClient := nil;
 end;
 //停止UDP
 if Assigned(IdUDPServerClient) then
 begin
   IdUDPServerClient.Active := false;
   IdUDPServerClient := nil;
 end;

 if Assigned(myRunClass) then myRunClass := nil;
end;

//启动客户端 ,返回值1为登录成功,2为用户满,3为连接失败
function StartClient(): Wordbool;  stdcall;
var
i, r : Integer;
sReceiveStr, s : String; //收到的字符串
begin
 //判断是否已运行
 if (bIsLoaded) then
 begin
   Result := true;
   exit;;
 end;

 //初始化参数
 InitDll;

 //初始化返回值
 r := 3;
 if Assigned(IdUDPServerClient) then
 begin
   with IdUDPServerClient do
   begin
     i := 0;
     //如果没有收到回复则连续发送3遍
     while (i < 3) do
     begin
       i := i + 1;
       try
         //打开客户端准备发送登陆包
         if (not Active) then Active := True;
         //广播登陆数据包
         Broadcast(cLoadingStr + IdUDPServerClient.LocalName, cSendPort);
         //接收包
         sReceiveStr := ReceiveString(ReceiveIP, ReceivePort, 2000);
         //判断是否登陆包
         if (Length(Trim(sReceiveStr)) >= 4) then
         begin
           //取标识字符串
           s := Copy(sReceiveStr,1,3);
           //表示用户满
           if (s = cUserFull) then
           begin
             MessageDlg('验证失败:当前用户数已达到最大用户数!',mtError,[mbOK],0);
             DestroyClient;
             Result := false;
             Exit;
           end;
           //加密狗不存在
           if (s = cNotExistDog) then
           begin
             MessageDlg('验证失败:服务端没有安装加密狗!',mtError,[mbOK],0);
             DestroyClient;
             Result := false;
             Exit;
           end;
           //登录成功
           if (s = cAcceptForLoaded) then
           begin
             bIsLoaded := True;
             //设置发送在线包时间

             with TimerClient do
             begin
               Enabled := False;
               Interval := StrToInt (copy(sReceiveStr, 4, Length(sReceiveStr))) * 1000;
               Enabled := True;
             end;
             Result := true;
             Exit;
           end;
         end
         else
         begin
           if i >= 3 then
           begin
             MessageDlg('验证失败:无法连接服务端!',mtError,[mbOK],0);
             Result := false;
             DestroyClient;
             Exit;
           end;
         end;
       except
         MessageDlg('验证失败:程序运行出现错误,请与软件开发商联系!',mtError,[mbOK],0);
         Result := false;
         DestroyClient;
         Exit;
       end;
     end;
   end;
 end;
end;

//客户端退出
function EndClient() : Wordbool; Stdcall;
var
 i: Integer;
 sReceiveStr: String;
 r : boolean;
begin
 r := true;
 if bIsLoaded  and Assigned(IdUDPServerClient) then
 begin
   with IdUDPServerClient do
   begin
     try
       if (not Active) then Active := True;
       //发送一条退出包
       try
         send(ReceiveIP,ReceivePort,cExitStr);
       except
       end;
       {//接收返回包,超时时间设为2秒
         sReceiveStr := ReceiveString(ReceiveIP, ReceivePort, 2000);
         if SameText (copy(sReceiveStr, 1, 3), cAcceptForExit) then
         begin
         r := true;
         end;  }
     except
       r := false;
     end;
   end;
   DestroyClient;
 end;
 Result := r;
end;

exports
 StartClient,
 EndClient;
 
{ TMyClass }

procedure TMyClass.RunTimer(Sender: TObject);
begin
  if Assigned(IdUDPServerClient) then
  begin
    try
      IdUDPServerClient.send(ReceiveIP,ReceivePort,cRunStr);
    except
    end;
  end;
end;
在调用该DLL时有的机器上能正常运行,有的机器上停止响应,为什么吗???
还有在退出时怎么释放端口?
 
 
 

UDP通讯问题,哪位大侠能帮我看看问题出在哪?

帖子ADV » 星期三, 2004年7月21日 17:38


高手们帮帮我呀
 
 
 

UDP通讯问题,哪位大侠能帮我看看问题出在哪?

帖子wql » 星期六, 2004年7月24日 11:12


ding!