用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.
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.
解决方案 »
- DelphiDistiller.exe 运行出错 等达人牛人神人.....
- 新手求救:在image上用canvas画一个很粗的线条,如何让这个粗条半透明显示呢?
- 为什么无法关闭系统托盘弹出的快捷菜单?
- 问高手,关于WebBrowser控件使用的高级问题 (Cookie)
- 关于两棵树之间的拖动问题,,在线很快就结贴!!!!
- 谁知道有什么软件可以修改或删除DLL中的图片?
- a ocx component,available in VB,do not work in delphi with the error message "valid object expected as argument".why?thanks.
- 数据库动态建立语法改错
- 如何安装infopower2000 3000,
- 如何获取一个数在内存中的4个字节的十进制值?
- 怎么用DELPHI做个程序来检测某个应用程序是否在运行?如果在运行就关闭该应用程序?
- 请问,哪里有日文版IE6.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;
……………………