SimpleSocket 1.0 examples
Dependencies: EthernetNetIf SimpleSocket 1.0 mbed
Diff: main.cpp
- Revision:
- 2:304672a01127
- Parent:
- 1:7350a2598a80
- Child:
- 3:464dd710e6f6
diff -r 7350a2598a80 -r 304672a01127 main.cpp --- a/main.cpp Tue Aug 16 02:50:52 2011 +0000 +++ b/main.cpp Tue Aug 16 06:56:48 2011 +0000 @@ -3,82 +3,136 @@ #include "TCPSocket.h" #include "SocketUtil.h" -EthernetNetIf eth; -DigitalOut led1(LED1); +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); -TCPSocket tcp; //The listening port where requests are queued -TCPSocket* link; //The port where accepted requests can communicate -Host local(IpAddr(), 1234); // mbed -Host client; + 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); -void onLinkSocketEvent(TCPSocketEvent e) { - SocketEvent event = e; - printf(event); + 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_READABLE: - char buf[128]; - while (int len = link->recv(buf, 128)) { - // And send straight back out again - link->send(buf, len); - buf[len] = 0; // make terminater - printf("Received & Wrote: %s\n",buf); + 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()); } - break; - case TCPSOCKET_DISCONNECTED: - link->close(); - break; + } + + return NULL; } -} - -void onTCPSocketEvent(TCPSocketEvent e) { - SocketEvent event = e; - printf(event); - switch (event) { - case TCPSOCKET_ACCEPT: - if (SocketError err = tcp.accept(&client, &link)) { - printf(err); - } else { - link->setOnEvent(&onLinkSocketEvent); - IpAddr ip = client.getIp(); - printf("Incoming TCP connection from %d.%d.%d.%d\r\n", ip[0], ip[1], ip[2], ip[3]); - } - break; - - case TCPSOCKET_DISCONNECTED: - tcp.close(); - break; - } -} +private: + int port; + TCPSocket ssocket; //The listening port where requests are queued + bool ssocketAcceptEvent; +}; int main() { - //Basic setup - printf("Welcome to wireFUSE\n"); - printf("Setting up...\n"); - EthernetErr ethErr = eth.setup(); - if (ethErr) - error("Error %d in setup.\n", ethErr); - printf("Setup OK\n"); - - tcp.setOnEvent(&onTCPSocketEvent); - - //Bind to local port - SocketError bindErr = tcp.bind(local); - printf("Init bind... %s", (char *) bindErr); - - //Listen to local port - TCPSocketErr listenErr = tcp.listen(); - printf("Init listen... %s", (char *)listenErr); - + DigitalOut led1(LED1); + DigitalOut led2(LED2); + ServerSocket server(1234); + server.init(); Timer timer; timer.start(); + while (true) { - Net::poll(); - if (timer.read() > 10) { + 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(); - led1 = !led1; //Show that we are alive - printf("waiting for client on port 1234\n"); + timer.start(); + led2 = !led2; } } } \ No newline at end of file