Listing 1: Skeleton of the simple socket wrapper

class TCPSocketWrapper
{
    class TCPAcceptedSocket
    {
        // ...
    };

public:
    enum sockstate_type { CLOSED, LISTENING,
        ACCEPTED, CONNECTED };

    TCPSocketWrapper();
    ~TCPSocketWrapper();

    // this is provided for syntax
    // TCPSocketWrapper s2(s2.accept());
    TCPSocketWrapper(const TCPAcceptedSocket &as);

    // server methods

    // binds and listens on a given port number
    void listen(int port, int backlog = 100);
    
    // accepts the new connection
    // it requires the earlier call to listen
    TCPAcceptedSocket accept();

    // client methods

    // creates the new connection
    void connect(const char *address, int port);

    // general methods

    // get the current state of the socket wrapper
    sockstate_type state() const { return sockstate; }

    // get the network address
    // and port number of this socket
    const char * address() const;
    int port() const;

    // write data to the socket
    void write(const void *buf, int buflen);

    // read data from the socket
    // returns the number of bytes read
    int read(void *buf, int buflen);

    // close socket
    void close();

private:
    // copy is not supported
    TCPSocketWrapper(const TCPSocketWrapper&);
    TCPSocketWrapper& operator=(const TCPSocketWrapper&);
};
— End of Listing —