.NET Fiddle

CSharp · Console

/Program.cs

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
}
;