散分,TClientSocket断开后自动重连服务器问题?

gust99 2003-10-22 11:17:50
问题描述祥见我的另一帖!解决后,再开帖送分!

http://expert.csdn.net/Expert/topic/2372/2372800.xml?temp=.9404261
...全文
111 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoguoru 2004-02-27
  • 打赏
  • 举报
回复
试一下在服务器端检测如果某一客户端断了,你就将那个连接套接字也执行一次关闭操作。
hongliqiu 2003-10-31
  • 打赏
  • 举报
回复
问题是,如果服务器不开,不断的连的话,就会出现缓冲区满的异常

这样的话,等待的时间使它不断延长。
或者重试多次后等待一个比较长的随机时间,再重试连接。如此循环。
Yuehj 2003-10-31
  • 打赏
  • 举报
回复
在Socket的Disconnected事件中打开一个定时器,在定时器事件中重新建立连接,十分有效
代码简单易懂,只需3行代码即可

gust99 2003-10-25
  • 打赏
  • 举报
回复
matq2008(叶子) ,我就是用TEvent实现你的方法的,问题是,如果服务器不开,不断的连的话,就会出现缓冲区满的异常
叶子哟 2003-10-24
  • 打赏
  • 举报
回复
何->果,呵呵
叶子哟 2003-10-24
  • 打赏
  • 举报
回复
俺提供一种笨方法:用个Timer控件,隔一定时间检查一下,如何active=false,则active=true
sunny6281 2003-10-23
  • 打赏
  • 举报
回复
关注
friendbcb 2003-10-22
  • 打赏
  • 举报
回复
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <ScktComp.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TLabel *Label1;
TTimer *Timer1;
void __fastcall Timer1Timer(TObject *Sender);
void __fastcall ClientSocketConnect(TObject *Sender,
TCustomWinSocket *Socket);
void __fastcall ClientSocketDisconnect(TObject *Sender,
TCustomWinSocket *Socket);
void __fastcall ClientSocketError(TObject *Sender,
TCustomWinSocket *Socket, TErrorEvent ErrorEvent,
int &ErrorCode);
void __fastcall FormCreate(TObject *Sender);
void __fastcall ClientSocketConnecting(TObject *Sender,
TCustomWinSocket *Socket);
private: // User declarations
TClientSocket *MyCliSocket ;
public: // User declarations
__fastcall TForm1(TComponent* Owner);
public:
TClientSocket * __fastcall InitClientSocket();
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
MyCliSocket=NULL;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
if(MyCliSocket)
{
MyCliSocket->Close();
delete MyCliSocket;
}
MyCliSocket=InitClientSocket();
MyCliSocket->Open();
}
//---------------------------------------------------------------------------
TClientSocket * __fastcall TForm1::InitClientSocket()
{
TClientSocket *TempSocket=new TClientSocket(this);
TempSocket->Host="127.0.0.1";
TempSocket->Port=5555;
TempSocket->OnConnect=ClientSocketConnect;
TempSocket->OnDisconnect=ClientSocketDisconnect;
TempSocket->OnError=ClientSocketError;
TempSocket->OnConnecting=ClientSocketConnecting;
return TempSocket;
}
void __fastcall TForm1::ClientSocketConnect(TObject *Sender,
TCustomWinSocket *Socket)
{
Timer1->Enabled=false;
Label1->Caption="已连接";
Label1->Update();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ClientSocketDisconnect(TObject *Sender,
TCustomWinSocket *Socket)
{
Timer1->Enabled=true;
Label1->Caption="断开连接";
Label1->Update();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ClientSocketError(TObject *Sender,
TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
Label1->Caption="发生错误";
Label1->Update();
ErrorCode=0;
if(Timer1->Enabled==false)
Timer1->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
if(MyCliSocket==NULL)
MyCliSocket=InitClientSocket();
MyCliSocket->Open();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ClientSocketConnecting(TObject *Sender,
TCustomWinSocket *Socket)
{
Label1->Caption="正在连接";
Label1->Update();
}
//---------------------------------------------------------------------------


object Form1: TForm1
Left = 297
Top = 185
Width = 309
Height = 235
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object Label1: TLabel
Left = 104
Top = 136
Width = 32
Height = 13
Caption = 'Label1'
end
object Timer1: TTimer
Enabled = False
Interval = 5000
OnTimer = Timer1Timer
Left = 192
Top = 32
end
end
warton 2003-10-22
  • 打赏
  • 举报
回复
up
gust99 2003-10-22
  • 打赏
  • 举报
回复
不会吧,没人想要分!

1,316

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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