服务端开启某一端口,有很多对端往服务端发送数据,运行一段时间后(时间不定,有时长有时短)不能接收到任何数据,(但是用CommView来监测却可以看到有数据发送到这一端口),重启程序也没用,只有重启电脑才可以。另:服务端下发数据可能采用IdUDPServer.SendBuffer、ABinding.SendTo两种方式,INDY8、9、10都试过了
  这个问题困扰了很久,一直找不到解决的办法

解决方案 »

  1.   

    对这个不熟,
    但我认为像sendbuffer和readbuffer这样的函数,有数据,是能读的
    不该会应为时间出问题的
      

  2.   

    把你代码贴出看下,用我用indy控件做过类似的东西,并没出现楼主的问题。所以估计还是你发送或读取的代码有问题
      

  3.   

    procedure FIdUDPServerUDPRead(
      Sender: TObject; AData: TIdBytes; ABinding: TIdSocketHandle);
    var
      lReceiveLen:integer;
      lCurrentReceiveBuf:array of byte;
    begin
      lReceiveLen:=Length(AData) ;
      setlength(lCurrentReceiveBuf, lReceiveLen );
      Move(AData[0],lCurrentReceiveBuf[0],lReceiveLen);  if assigned(FOnSocketReceiveBuf) then
      begin
        FOnSocketReceiveBuf(self,lCurrentReceiveBuf, lReceiveLen);
      end;
      ...
      处理数据
    end;处理数据过程一般会有回应数据,通过ABinding.SendTo发送回应数据
    另外的数据发送使用FIdUDPServer.SendBuffer(PeerIP,PeerPort,lContentBuf);
      

  4.   

    IdUDPServer控件不能使用IdUDPServer.SendBuffer发送数据,发送数据请用ABinding.SendTo
      

  5.   

    我已经把FIdUDPServer.SendBuffer改成用IdUDPClient来发送了,可还是有这个问题,郁闷了
      

  6.   

    IdUDPServer只负责接收数据,不使用IdUDPServer来发数据,
    发数据使用IdUDPClient,或使用ABinding.SendTo,严格遵循这些约定,
    就算运行很久也不会有问题的。
    我的一个应用,运行了好久了,还没有发现问题
      

  7.   

    谢谢  lzf1010(深宇),我现在是这样做,我把ABinding.SendTo都改成IdUDPClient来发了,呵呵,看看还会不会有问题,我这里数据比较多,要不要把BUFFERSIZE改大一点?
      

  8.   

    你是多线程的应用吗?假如是多线程的应用的话,这样做比较好
    IdUDPServer每触发一次read的事件,在事件处理里新建一个线程,在线程里处理其它事件
    还有一个需要注意的是,不要忘了放上一个IdAntiFreeze控件,祝好运!
      

  9.   

    我是这样处理的,每接收一次数据即开启一个服务线程
    procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
      ABinding: TIdSocketHandle);
    begin
      TServiceThread.Create(AData,ADOConnection1,ABinding);
    end;
      

  10.   

    按道理服务线程不是必需的,数据库操作是比较费时的,我这里并没有数据库操作现在开始有点怀疑系统的问题,我在win2000下开发,程序运行在win2003?