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