socket error#10054 connection reset by peer

kof19840203 2009-10-22 10:04:19
客户端和服务器连接的时候就出现以上问题。。在本机上的客户端连接本机运行的服务器没有问题,但是在其他机器上的客户端连接就出问题了。。

客户端

unit UnitLogin;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,HttpApp,inifiles, ScktComp, IdBaseComponent,
IdComponent, IdIPWatch, Menus, Sockets, IdTCPConnection, IdTCPClient,
ExtCtrls, IdAntiFreezeBase, IdAntiFreeze;
type
User_Info=record
User_Number:String[8];//登录的JJ号
User_Password:String[12];//登录密码
User_IpAddress:String[15];//用户的IP地址
end;
type
TFormlogin = class(TForm)
LabelLoginName: TLabel;
LabelPassword: TLabel;
EditPassword: TEdit;
ButtonLogin: TButton;
ComboBoxLoginName: TComboBox;
ButtonSet: TButton;
Button1: TButton;
IdIPWatch1: TIdIPWatch;
IdTCPClient1: TIdTCPClient;
Timer1: TTimer;
IdAntiFreeze1: TIdAntiFreeze;
procedure ComboBoxLoginNameKeyPress(Sender: TObject; var Key: Char);
procedure EditPasswordKeyPress(Sender: TObject; var Key: Char);
procedure ButtonLoginClick(Sender: TObject);
procedure ButtonSetClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure IdTCPClient1Disconnected(Sender: TObject);
procedure IdTCPClient1Connected(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Formlogin: TFormlogin;
info:user_info;
Str:String;
td:DWORD;
doConnect:Boolean;
implementation

uses UnitSet, UnitChat, server;

{$R *.dfm}
{procedure readthread;
var
s:String;
begin
while doConnect do
begin
s:=FormLogin.IdTCPClient1.ReadLn;
sleep(100);
end;
end;}

procedure TFormlogin.ComboBoxLoginNameKeyPress(Sender: TObject;
var Key: Char);
begin
case Key of
'0'..'9',#8:;
#27:ComboBoxLoginName.Text:='';
#13:self.EditPassword.SetFocus;
else Key:=#0;
end;
end;

procedure TFormlogin.EditPasswordKeyPress(Sender: TObject; var Key: Char);
begin
case Key of
'0'..'9','a'..'z','A'..'Z',#8:;
#27:EditPassword.Text:='';
#13:self.ButtonLoginClick(self);
else Key:=#0;
end;
end;

procedure TFormlogin.ButtonLoginClick(Sender: TObject);
var
recInfo:String;
begin
//CreateThread(nil,0,@ReadThread,nil,0,td);
if self.IdTCPClient1.Connected then
idtcpclient1.Disconnect;
if (self.ComboBoxLoginName.Text<>'') and (self.EditPassword.Text<>'') then
begin
IdTCPClient1.Host:=intToStr(ini.ReadInteger('config','ip0',192))+'.'+intToStr(ini.ReadInteger('config','ip1',168))+'.'+intToStr(ini.ReadInteger('config','ip2',0))+'.'+intToStr(ini.ReadInteger('config','ip3',87));
IdTCPClient1.Port:=8088;
IdTCPClient1.Connect;
info.User_Number:=comboboxLoginName.Text;
info.User_Password:=EditPassword.Text;
info.User_IpAddress:=IdIPWatch1.LocalIP;
IdTCPClient1.WriteBuffer(info,sizeof(info),true);
recinfo:=IdTCPClient1.ReadLn;
if recInfo='ls' then
begin
showmessage('登陆成功');
self.Hide;
formchat.Show;
end
else
begin
showmessage('登录失败');
idtcpclient1.Disconnect;
end;
end
else
begin
showmessage('用户名或密码不能为空');
end;
end;
procedure TFormlogin.ButtonSetClick(Sender: TObject);

begin
formSet.Show;
ButtonSet.Enabled:=false;
end;

procedure TFormlogin.FormShow(Sender: TObject);
begin
ComboboxLoginName.SetFocus();
end;

procedure TFormlogin.FormCreate(Sender: TObject);
begin
showmessage('本机的IP地址为'+self.IdIPWatch1.LocalIP);
inifileName:=Extractfilepath(application.ExeName)+'ip.ini';
ini:=TiniFile.Create(iniFileName);
end;

procedure TFormlogin.Button1Click(Sender: TObject);
begin
formServer.show;
end;
procedure TFormlogin.IdTCPClient1Disconnected(Sender: TObject);
begin
formserver.StatusBar1.Panels[0].Text:='客户端'+IdIPWatch1.LocalIP+'断开连接';
end;

procedure TFormlogin.IdTCPClient1Connected(Sender: TObject);
begin
formserver.StatusBar1.Panels[0].Text:='客户端'+IdIPWatch1.LocalIP+'已经连接';
end;

end.
--------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------
-----------------------------------------服务器端-------------------------------------------------------------


unit server;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, ScktComp, ToolWin, ComCtrls, StdCtrls, FileCtrl, Menus,
DB, ADODB, IdBaseComponent, IdComponent, IdTCPServer;

const
CMax=10;

type
User_Info1=record
User_Number:String[8];//登录的JJ号
User_Password:String[12];//登录密码
User_IpAddress:String[15];//用户的IP地址
end;

type
TformServer = class(TForm)
ControlBar1: TControlBar;
ToolBar1: TToolBar;
ButtonConnect: TButton;
ButtonBreak: TButton;
ButtonClose: TButton;
StatusBar1: TStatusBar;
Memo1: TMemo;
Edit1: TEdit;
ListBox1: TListBox;
ADOConnection1: TADOConnection;
ADOQuery1: TADOQuery;
IdTCPServer1: TIdTCPServer;

procedure ButtonCloseClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure IdTCPServer1Connect(AThread: TIdPeerThread);
procedure ButtonConnectClick(Sender: TObject);
procedure IdTCPServer1Exception(AThread: TIdPeerThread;
AException: Exception);
procedure IdTCPServer1Status(ASender: TObject;
const AStatus: TIdStatus; const AStatusText: String);
procedure IdTCPServer1Execute(AThread: TIdPeerThread);
procedure ButtonBreakClick(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;

var
formServer: TformServer;
info1:User_Info1;
implementation

uses UnitLogin;

{$R *.dfm}

procedure TformServer.ButtonCloseClick(Sender: TObject);
begin
close;
IdTCPServer1.Destroy;
self.IdTCPServer1.Active:=false;
self.StatusBar1.Panels[0].Text:='服务器已关闭';
end;

procedure TformServer.FormClose(Sender: TObject; var Action: TCloseAction);
begin
self.ADOQuery1.Free;
self.ADOConnection1.Free;
IdTCPServer1.Destroy;
if formlogin.IdTCPClient1.connected then
formLogin.IdTCPClient1.Disconnect;
end;


procedure TformServer.IdTCPServer1Connect(AThread: TIdPeerThread);
begin
Athread.Connection.ReadBuffer(info1,sizeof(info1));
self.ADOQuery1.SQL.Clear;
self.ADOQuery1.SQL.Add('select * from users where user_Number='+info1.User_Number+' and user_password="'+info1.User_Password+'"');
self.ADOQuery1.Open;
if not ADOQuery1.IsEmpty then
begin
Athread.Connection.WriteLn('ls');
end
else
begin
athread.Connection.WriteLn('lf');
end;
ADOQuery1.Close;

end;

procedure TformServer.ButtonConnectClick(Sender: TObject);
begin
IdTCPServer1.Active:=true;
self.IdTCPServer1.DefaultPort:=8088;
self.StatusBar1.Panels[0].Text:='服务器已开启';
end;

procedure TformServer.IdTCPServer1Exception(AThread: TIdPeerThread;
AException: Exception);
begin
showmessage(Athread.Connection.Socket.Binding.PeerIP+Aexception.Message);
end;

procedure TformServer.IdTCPServer1Status(ASender: TObject;
const AStatus: TIdStatus; const AStatusText: String);
begin
showmessage('这是状态选项里的文本'+AStatusText);
end;

procedure TformServer.IdTCPServer1Execute(AThread: TIdPeerThread);
begin
// Athread.FreeOnTerminate:=true;

end;

procedure TformServer.ButtonBreakClick(Sender: TObject);
begin
self.IdTCPServer1.Active:=false;
self.StatusBar1.Panels[0].Text:='服务器已关闭';
end;

end.
...全文
2027 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
starluck 2009-10-22
  • 打赏
  • 举报
回复
Athread.Connection.ReadBuffer(info1,sizeof(info1));

是不是这里等待的时候,client 主动断开了
kof19840203 2009-10-22
  • 打赏
  • 举报
回复
是主动断开了。百思不得其解
shuihan20e 2009-10-22
  • 打赏
  • 举报
回复
有一端主动断开了
kof19840203 2009-10-22
  • 打赏
  • 举报
回复
我晕死,我把登录的验证放到excute里,虽然通信正常,但是还是没有解决connect reset by peer这个问题
starluck 2009-10-22
  • 打赏
  • 举报
回复
看你上一贴.

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧