CSharp · Console
using System;
Transition[] events = { Transition.APP_PASSIVE_OPEN, Transition.APP_SEND, Transition.RCV_SYN_ACK };
State state = State.CLOSED;
foreach (Transition @event in events)
{
state = (state, @event) switch
{
(State.CLOSED, Transition.APP_PASSIVE_OPEN) => State.LISTEN,
(State.CLOSED, Transition.APP_ACTIVE_OPEN) => State.SYN_SENT,
(State.LISTEN, Transition.RCV_SYN) => State.SYN_RCVD,
(State.LISTEN, Transition.APP_SEND) => State.SYN_SENT,
(State.LISTEN, Transition.APP_CLOSE) => State.CLOSED,
(State.SYN_RCVD, Transition.APP_CLOSE) => State.FIN_WAIT_1,
(State.SYN_RCVD, Transition.RCV_ACK) => State.ESTABLISHED,
(State.SYN_SENT, Transition.RCV_SYN_ACK) => State.SYN_RCVD,
(State.SYN_SENT, Transition.APP_CLOSE) => State.ESTABLISHED,
(State.SYN_SENT, Transition.RCV_ACK) => State.CLOSED,
(State.ESTABLISHED, Transition.APP_CLOSE) => State.FIN_WAIT_1,
(State.ESTABLISHED, Transition.RCV_FIN) => State.CLOSE_WAIT,
(State.FIN_WAIT_1, Transition.RCV_FIN) => State.CLOSING,
(State.FIN_WAIT_1, Transition.RCV_FIN_ACK) => State.TIME_WAIT,
(State.FIN_WAIT_1, Transition.RCV_ACK) => State.FIN_WAIT_2,
(State.CLOSING, Transition.RCV_ACK) => State.TIME_WAIT,
(State.FIN_WAIT_2, Transition.RCV_FIN) => State.TIME_WAIT,
(State.TIME_WAIT, Transition.APP_TIMEOUT) => State.CLOSED,
(State.CLOSE_WAIT, Transition.APP_CLOSE) => State.LAST_ACK,
(State.LAST_ACK, Transition.RCV_ACK) => State.CLOSED,
_ => State.ERROR
};
if (state == State.ERROR)
{
break;
}
}
Console.WriteLine(state);
enum Transition
{
APP_PASSIVE_OPEN,
APP_ACTIVE_OPEN,
RCV_SYN,
APP_SEND,
APP_CLOSE,
RCV_ACK,
RCV_SYN_ACK,
RCV_FIN,
RCV_FIN_ACK,
APP_TIMEOUT
}
enum State
{
ERROR,
CLOSED,
LISTEN,
SYN_SENT,
SYN_RCVD,
ESTABLISHED,
CLOSE_WAIT,
LAST_ACK,
FIN_WAIT_1,
FIN_WAIT_2,
TIME_WAIT,
CLOSING
}