用indy写了很短的一段idTcpServer,但是在客户机closesocket的时候,idTcpServer报错,错误为:socket error #10054, connection reset by peer.  请问各位朋友,这是怎么会事啊,我是真的搞不定了。(我的客户端是linux下的c写的,肯定没问题,已经测试过)unit Unit1;interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdComponent, IdTCPServer, IdBaseComponent,
  IdThreadMgr, IdThreadMgrDefault;  type
  TSimpleClient = class(TObject)
    DNS         : String;
    Thread      : Pointer;
  end;type
  TForm1 = class(TForm)
    Memo1: TMemo;
    IdThreadMgrDefault1: TIdThreadMgrDefault;
    TCPServer: TIdTCPServer;
    Button1: TButton;
    Label1: TLabel;
    Edit1: TEdit;
    Label2: TLabel;
    Edit2: TEdit;
    procedure FormShow(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure TCPServerConnect(AThread: TIdPeerThread);
    procedure TCPServerDisconnect(AThread: TIdPeerThread);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure TCPServerExecute(AThread: TIdPeerThread);
  private
    { Private declarations }
  public
    Clients  : TList;
  end;var
  Form1: TForm1;implementation{$R *.dfm}
uses
  IdSocketHandle;  // This is where the IdSocketHandle class is defined.
procedure TForm1.FormShow(Sender: TObject);
var
  Binding : TIdSocketHandle;
begin
      TCPServer.Active := false;
      TCPServer.Bindings.Clear;
      Binding:=TCPServer.Bindings.Add;
      Binding.IP :=edit1.text; //GStack.LocalAddress;
      Binding.Port := strtoint(edit2.Text);  //8001;
      TCPServer.Active := true;
end;procedure TForm1.Button1Click(Sender: TObject);
var
  Binding : TIdSocketHandle;
begin
      TCPServer.Active := false;
      TCPServer.Bindings.Clear;
      Binding:=TCPServer.Bindings.Add;
      Binding.IP :=edit1.text; //GStack.LocalAddress;
      Binding.Port := strtoint(edit2.Text);  //8001;
      TCPServer.Active := true;
end;procedure TForm1.TCPServerConnect(AThread: TIdPeerThread);
var
  Client : TSimpleClient;
begin
{ Create a client object }
  Client := TSimpleClient.Create;
{ Assign its default values }
  Client.DNS  := AThread.Connection.LocalName;
{ Assign the thread to it for ease in finding }
  Client.Thread := AThread;
{ Add to our clients list box }
  memo1.Lines.Add(Client.DNS);
{ Assign it to the thread so we can identify it later }
  AThread.Data := Client;
{ Add it to the clients list }
  //Clients.Add(Client);
end;procedure TForm1.TCPServerDisconnect(AThread: TIdPeerThread);
var
  Client : TSimpleClient;
begin
{ Retrieve Client Record from Data pointer }
  Client := Pointer(AThread.Data);
{ Remove Client from the Clients List Box }
  Memo1.Lines.Add(client.dns+'     quit') ;
{ Free the Client object }
  Client.Free;
  AThread.Data := nil;
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin clients.Free;
 tcpserver.Active :=false;
end;procedure TForm1.TCPServerExecute(AThread: TIdPeerThread);
var
  Client : TSimpleClient;
  Msg    : String;
  var revmsg: array[1..100] of Char;
begin
  fillchar(revmsg,100,0);
{ Get the text sent from the client }
  AThread.Connection.Readbuffer(revmsg,100);
{ Get the clients package info }
  Client := Pointer(AThread.Data);
{ Check to see if the clients name has been assigned yet }  memo1.Lines.Add(revmsg);
  if revmsg<>'' then
     AThread.Connection.Writebuffer('received ok',11,true);
end;end.

解决方案 »

  1.   

    你客户端断开的时候引起的是复位,没有主动断,服务器就会有异常,是允许范围内的异常,也能触发disconnect事件,不过还是主动断开好些。编译成exe文件后,这个异常不会弹出来。
      

  2.   

    客户端断开时可以发送命令如(quit)到server端,server端主动端开。
      

  3.   

    6.0好象没有这个控件。
    不过感觉应该和socketserver差不多吧。
    socketserver错误处理方法:
    procedure TFrm_Main.SocketServerClientError(Sender: TObject;
      Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
      var ErrorCode: Integer);
    var i : integer;
    begin
      errorcode := 0;
      for i := 0 to sessions do
      if session[i].CHandle = socket.Handle then
         session[i].CSocket.Close;
         ……………………