state

#include <iostream>
using namespace std;
class tcpoctetstream;
class tcpstate;
class tcpclosed;
class tcpconnection {
public:
  tcpconnection();
  void activeopen();
  void passiveopen();
  void close();
  void send();
  void acknowledge();
  void synchronize();
  void processoctet(tcpoctetstream *);
private:
  friend class tcpstate;
  void changestate(tcpstate *);
private:
  tcpstate * _state;
};
class tcpstate {
public:
  virtual void activeopen(tcpconnection *){}
  virtual void passiveopen(tcpconnection *){}
  virtual void close(tcpconnection *){}
  virtual void synchronize(tcpconnection *){}
  virtual void acknowledge(tcpconnection *){}
  virtual void send(tcpconnection *){}
protected:
  void changestate(tcpconnection *, tcpstate *);
};
class tcpestablished : public tcpstate {
public:
  static tcpstate *instance();
  virtual void close(tcpconnection *){}
private:
  static tcpestablished* _instance;
};
tcpestablished * tcpestablished::_instance = 0;
tcpstate *tcpestablished::instance()
{
  if (_instance == 0)
    _instance = new tcpestablished;
  cout << "tcp established" << endl;
  return _instance;
}
class tcpclosed : public tcpstate {
public:
  static tcpstate *instance();
  virtual void activeopen(tcpconnection *);
  virtual void passiveopen(tcpconnection *);
private:
  static tcpclosed * _instance;
};
tcpclosed *tcpclosed::_instance = 0;
tcpstate *tcpclosed::instance()
{
  if (_instance == 0)
    _instance = new tcpclosed;
  cout << "tcp closed" << endl;
  return _instance;
}
class tcplisten : public tcpstate {
public:
  static tcpstate *instance();
private:
  static tcplisten *_instance;
};
tcplisten *tcplisten::_instance = 0;
tcpstate *tcplisten::instance()
{
  if (_instance == 0)
    _instance = new tcplisten;
  cout << "tcp listen" << endl;
  return _instance;
}
void tcpclosed::activeopen(tcpconnection *t)
{
  changestate(t, tcpestablished::instance());
}
void tcpclosed::passiveopen(tcpconnection *t)
{
  changestate(t, tcplisten::instance());
}
tcpconnection::tcpconnection(){ _state = tcpclosed::instance();}
void tcpconnection::activeopen(){_state->activeopen(this);}
void tcpconnection::passiveopen(){_state->passiveopen(this);}
void tcpconnection::close(){_state->close(this);}
void tcpconnection::synchronize(){_state->synchronize(this);}
void tcpconnection::acknowledge(){_state->acknowledge(this);}
void tcpconnection::send(){_state->send(this);}
void tcpconnection::changestate(tcpstate *newstate){_state = newstate;}
void tcpstate::changestate(tcpconnection *t, tcpstate *s)
{
  t->changestate(s);
}

int main()
{
  tcpconnection *tconn = new tcpconnection;
  tconn->activeopen();
  tconn->passiveopen();
  delete tconn;
  return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值