SimpleSocket 1.0 examples

Dependencies:   EthernetNetIf SimpleSocket 1.0 mbed

main.cpp

Committer:
yamaguch
Date:
2011-08-16
Revision:
2:304672a01127
Parent:
1:7350a2598a80
Child:
3:464dd710e6f6

File content as of revision 2:304672a01127:

#include "mbed.h"
#include "EthernetNetIf.h"
#include "TCPSocket.h"
#include "SocketUtil.h"

class ClientSocket {
public:
    ClientSocket(TCPSocket *socket) : socket(socket) {
        socket->setOnEvent(this, &ClientSocket::onClientSocketEvent);
    }

    bool connected() {
        if (socket)
            Net::poll();
        return socket != 0;
    }

    void onClientSocketEvent(TCPSocketEvent e) {
        SocketEvent event = e;
        printf(event);

        switch (event) {
            case TCPSOCKET_READABLE:
                char buf[128];
                while (int len = socket->recv(buf, 128)) {
                    // And send straight back out again
                    socket->send(buf, len);
                    buf[len] = 0; // make terminater
                    printf("Received & Wrote: %s\n",buf);
                }
                break;
            case TCPSOCKET_DISCONNECTED:
                socket->close();
                delete socket;
                socket = 0;
                break;
        }
    }

private:
    TCPSocket *socket;
};

class ServerSocket {
public:
    ServerSocket(int port) : port(port), ssocketAcceptEvent(false) {}

    void init() {
        EthernetNetIf eth;
        EthernetErr ethErr = eth.setup();
        if (ethErr) error("Error %d in setup.\n", ethErr);

        ssocket.setOnEvent(this, &ServerSocket::onTCPSocketEvent);

        SocketError bindErr = ssocket.bind(Host(IpAddr(), port));
        printf("Init bind... %s", bindErr.toString());

        SocketError listenErr = ssocket.listen();
        printf("Init listen... %s", listenErr.toString());
    }


    void onTCPSocketEvent(TCPSocketEvent e) {
        SocketEvent event = e;
        printf(event);

        switch (event) {
            case TCPSOCKET_ACCEPT:
                ssocketAcceptEvent = true;
                //if (SocketError err = ssocket.accept(&client, &link)) {
                //    printf("accept:%s", err.toString());
                //} else {
                //    link->setOnEvent(this, &ServerSocket::onLinkSocketEvent);
                //    IpAddr ip = client.getIp();
                //    printf("Incoming TCP connection from %d.%d.%d.%d\n", ip[0], ip[1], ip[2], ip[3]);
                //}
                break;

            case TCPSOCKET_DISCONNECTED:
                ssocket.close();
                break;
        }
    }

    ClientSocket *accept() {
        Net::poll();

        if (ssocketAcceptEvent) {
            ssocketAcceptEvent = false;
            TCPSocket* socket;
            Host host;
            SocketError err = ssocket.accept(&host, &socket);

            if (!err) {
                ClientSocket *clientSocket = new ClientSocket(socket);
                IpAddr ip = host.getIp();
                printf("TCP connection from %d.%d.%d.%d\n", ip[0], ip[1], ip[2], ip[3]);
                return clientSocket;
            } else {
                printf("accept:%s", err.toString());
            }
        }

        return NULL;
    }

private:
    int port;
    TCPSocket ssocket;   //The listening port where requests are queued
    bool ssocketAcceptEvent;
};

int main() {
    DigitalOut led1(LED1);
    DigitalOut led2(LED2);
    ServerSocket server(1234);
    server.init();
    Timer timer;
    timer.start();

    while (true) {
    Net::poll();
        if (ClientSocket *clientSocket = server.accept()) {
            while (clientSocket->connected()) {
                if (timer.read() > 10) {
                    timer.reset();
                    timer.start();
                    led1 = !led1;
                }
            }
        }
        if (timer.read() > 1) {
            timer.reset();
            timer.start();
            led2 = !led2;
        }
    }
}