class TCPOctetStream;
class TCPState;
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 Transmit(TCPConnection*, TCPOctetStream*);
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 TCPClosed : public TCPState
{
public:
static TCPState* Instance(){ return new TCPState(); }
virtual void ActiveOpen(TCPConnection*);
virtual void PassiveOpen(TCPConnection*);
// ...
};
/*
*/
TCPConnection::TCPConnection ()
{
_state = TCPClosed::Instance();
}
/*
*/
void TCPConnection::ChangeState (TCPState* s)
{
_state = s;
}
/*
*/
void TCPConnection::ActiveOpen ()
{
_state->ActiveOpen(this);
}
/*
*/
void TCPConnection::PassiveOpen ()
{
_state->PassiveOpen(this);
}
/*
*/
void TCPConnection::Close ()
{
_state->Close(this);
}
/*
*/
void TCPConnection::Acknowledge ()
{
_state->Acknowledge(this);
}
/*
*/
void TCPConnection::Synchronize ()
{
_state->Synchronize(this);
}
/*
*/
void TCPState::Transmit (TCPConnection*, TCPOctetStream*) { }
void TCPState::ActiveOpen (TCPConnection*) { }
void TCPState::PassiveOpen (TCPConnection*) { }
void TCPState::Close (TCPConnection*) { }
void TCPState::Synchronize (TCPConnection*) { }
void TCPState::Acknowledge (TCPConnection*) { }
void TCPState::Send (TCPConnection*) { }
/*
*/
void TCPState::ChangeState (TCPConnection* t, TCPState* s)
{
t->ChangeState(s);
}
/*
*/
/*
*/
class TCPEstablished : public TCPState
{
public:
static TCPState* Instance(){ return NULL; }
virtual void Transmit(TCPConnection*, TCPOctetStream*);
virtual void Close(TCPConnection*);
};
/*
*/
class TCPListen : public TCPState
{
public:
static TCPState* Instance(){ return NULL; }
virtual void Send(TCPConnection*);
// ...
};
/*
*/
void TCPClosed::ActiveOpen (TCPConnection* t)
{
// send SYN, receive SYN, ACK, etc.
ChangeState(t, TCPEstablished::Instance());
}
/*
*/
void TCPClosed::PassiveOpen (TCPConnection* t)
{
ChangeState(t, TCPListen::Instance());
}
/*
*/
void TCPEstablished::Close (TCPConnection* t)
{
// send FIN, receive ACK of FIN
ChangeState(t, TCPListen::Instance());
}
/*
*/
void TCPEstablished::Transmit (
TCPConnection* t, TCPOctetStream* o
)
{
t->ProcessOctet(o);
}
/*
*/
void TCPListen::Send (TCPConnection* t)
{
// send SYN, receive SYN, ACK, etc.
ChangeState(t, TCPEstablished::Instance());
}
/*
*/
State
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.