我用的是serversocket控件,servertype为stnonBlocking;
在onclientread事件里的代码是这样的
procedure TfrmMain.ServerSocketClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  tmp:String;
  i,j:integer;
begin
 
  tmp:=socket.ReceiveText;
  socket.SendText('{A00000000z');
  socket.Close ;
end;
服务端收到信息后要向客户端返回一个信息,现在大概有十几个客户端,每个客户端五分钟发一次数据
这样服务端运行了几天后就收不到数据了,要重起计算机后才恢复正常
请大家帮忙想想,谢谢!

解决方案 »

  1.   


    那是因为端口用完了。事实上,你用SOCKET.CLOSE关闭当前连接时,因为SERVERSOCKET本身存在的BUG,它只释放了当前的链接字,但它所使用的端口并没有被真正释放。因此,你系统的端口号就一真是在增加的,当系统端口无法再增加时(全都被占用时),系统通讯就无法进行了。你可以在一个事件中处理这种情况.ServerSocketClientError(Sender: TObject;  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
      var ErrorCode: Integer);
    begin try
       //-----changed on time: 2005.10.24 10:34
       ErrorCode:=0;//允许系统来回收端口
       socket.close;//关闭当前的链接
       abort;//哑异常,直接跳出处理
     except
       //abort;
     end;end;
      

  2.   

    恩,谢谢,问题的原因是对的!但是 ErrorCode:=0的作用好象是不弹出错误窗口把!
    是不是可以使用诸如此类的调用api的方法:
    setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(BOOL));
    setsockopt(s,SOL_SOCKET,SO_DONTLINGER,(const char*)&bDontLinger,sizeof(BOOL));
    不过测试的时候好象time_wait不会消失,不知道为什么,可能是用错了!
      

  3.   

    ErrorCode:=0;的确是不弹出报错窗体;
    下一句:
    Socket.close;//这是关闭当前连接,同时会回收系统端口;