SimpleSocket 1.0 examples

Dependencies:   EthernetNetIf SimpleSocket 1.0 mbed

Committer:
yamaguch
Date:
Tue Aug 16 06:56:48 2011 +0000
Revision:
2:304672a01127
Parent:
1:7350a2598a80
Child:
3:464dd710e6f6
rewite 2 - broken

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yamaguch 1:7350a2598a80 1 #include "mbed.h"
yamaguch 1:7350a2598a80 2 #include "EthernetNetIf.h"
yamaguch 1:7350a2598a80 3 #include "TCPSocket.h"
yamaguch 1:7350a2598a80 4 #include "SocketUtil.h"
yamaguch 1:7350a2598a80 5
yamaguch 2:304672a01127 6 class ClientSocket {
yamaguch 2:304672a01127 7 public:
yamaguch 2:304672a01127 8 ClientSocket(TCPSocket *socket) : socket(socket) {
yamaguch 2:304672a01127 9 socket->setOnEvent(this, &ClientSocket::onClientSocketEvent);
yamaguch 2:304672a01127 10 }
yamaguch 2:304672a01127 11
yamaguch 2:304672a01127 12 bool connected() {
yamaguch 2:304672a01127 13 if (socket)
yamaguch 2:304672a01127 14 Net::poll();
yamaguch 2:304672a01127 15 return socket != 0;
yamaguch 2:304672a01127 16 }
yamaguch 2:304672a01127 17
yamaguch 2:304672a01127 18 void onClientSocketEvent(TCPSocketEvent e) {
yamaguch 2:304672a01127 19 SocketEvent event = e;
yamaguch 2:304672a01127 20 printf(event);
yamaguch 1:7350a2598a80 21
yamaguch 2:304672a01127 22 switch (event) {
yamaguch 2:304672a01127 23 case TCPSOCKET_READABLE:
yamaguch 2:304672a01127 24 char buf[128];
yamaguch 2:304672a01127 25 while (int len = socket->recv(buf, 128)) {
yamaguch 2:304672a01127 26 // And send straight back out again
yamaguch 2:304672a01127 27 socket->send(buf, len);
yamaguch 2:304672a01127 28 buf[len] = 0; // make terminater
yamaguch 2:304672a01127 29 printf("Received & Wrote: %s\n",buf);
yamaguch 2:304672a01127 30 }
yamaguch 2:304672a01127 31 break;
yamaguch 2:304672a01127 32 case TCPSOCKET_DISCONNECTED:
yamaguch 2:304672a01127 33 socket->close();
yamaguch 2:304672a01127 34 delete socket;
yamaguch 2:304672a01127 35 socket = 0;
yamaguch 2:304672a01127 36 break;
yamaguch 2:304672a01127 37 }
yamaguch 2:304672a01127 38 }
yamaguch 2:304672a01127 39
yamaguch 2:304672a01127 40 private:
yamaguch 2:304672a01127 41 TCPSocket *socket;
yamaguch 2:304672a01127 42 };
yamaguch 2:304672a01127 43
yamaguch 2:304672a01127 44 class ServerSocket {
yamaguch 2:304672a01127 45 public:
yamaguch 2:304672a01127 46 ServerSocket(int port) : port(port), ssocketAcceptEvent(false) {}
yamaguch 2:304672a01127 47
yamaguch 2:304672a01127 48 void init() {
yamaguch 2:304672a01127 49 EthernetNetIf eth;
yamaguch 2:304672a01127 50 EthernetErr ethErr = eth.setup();
yamaguch 2:304672a01127 51 if (ethErr) error("Error %d in setup.\n", ethErr);
yamaguch 1:7350a2598a80 52
yamaguch 2:304672a01127 53 ssocket.setOnEvent(this, &ServerSocket::onTCPSocketEvent);
yamaguch 2:304672a01127 54
yamaguch 2:304672a01127 55 SocketError bindErr = ssocket.bind(Host(IpAddr(), port));
yamaguch 2:304672a01127 56 printf("Init bind... %s", bindErr.toString());
yamaguch 2:304672a01127 57
yamaguch 2:304672a01127 58 SocketError listenErr = ssocket.listen();
yamaguch 2:304672a01127 59 printf("Init listen... %s", listenErr.toString());
yamaguch 2:304672a01127 60 }
yamaguch 2:304672a01127 61
yamaguch 2:304672a01127 62
yamaguch 2:304672a01127 63 void onTCPSocketEvent(TCPSocketEvent e) {
yamaguch 2:304672a01127 64 SocketEvent event = e;
yamaguch 2:304672a01127 65 printf(event);
yamaguch 1:7350a2598a80 66
yamaguch 2:304672a01127 67 switch (event) {
yamaguch 2:304672a01127 68 case TCPSOCKET_ACCEPT:
yamaguch 2:304672a01127 69 ssocketAcceptEvent = true;
yamaguch 2:304672a01127 70 //if (SocketError err = ssocket.accept(&client, &link)) {
yamaguch 2:304672a01127 71 // printf("accept:%s", err.toString());
yamaguch 2:304672a01127 72 //} else {
yamaguch 2:304672a01127 73 // link->setOnEvent(this, &ServerSocket::onLinkSocketEvent);
yamaguch 2:304672a01127 74 // IpAddr ip = client.getIp();
yamaguch 2:304672a01127 75 // printf("Incoming TCP connection from %d.%d.%d.%d\n", ip[0], ip[1], ip[2], ip[3]);
yamaguch 2:304672a01127 76 //}
yamaguch 2:304672a01127 77 break;
yamaguch 2:304672a01127 78
yamaguch 2:304672a01127 79 case TCPSOCKET_DISCONNECTED:
yamaguch 2:304672a01127 80 ssocket.close();
yamaguch 2:304672a01127 81 break;
yamaguch 2:304672a01127 82 }
yamaguch 2:304672a01127 83 }
yamaguch 2:304672a01127 84
yamaguch 2:304672a01127 85 ClientSocket *accept() {
yamaguch 2:304672a01127 86 Net::poll();
yamaguch 2:304672a01127 87
yamaguch 2:304672a01127 88 if (ssocketAcceptEvent) {
yamaguch 2:304672a01127 89 ssocketAcceptEvent = false;
yamaguch 2:304672a01127 90 TCPSocket* socket;
yamaguch 2:304672a01127 91 Host host;
yamaguch 2:304672a01127 92 SocketError err = ssocket.accept(&host, &socket);
yamaguch 2:304672a01127 93
yamaguch 2:304672a01127 94 if (!err) {
yamaguch 2:304672a01127 95 ClientSocket *clientSocket = new ClientSocket(socket);
yamaguch 2:304672a01127 96 IpAddr ip = host.getIp();
yamaguch 2:304672a01127 97 printf("TCP connection from %d.%d.%d.%d\n", ip[0], ip[1], ip[2], ip[3]);
yamaguch 2:304672a01127 98 return clientSocket;
yamaguch 2:304672a01127 99 } else {
yamaguch 2:304672a01127 100 printf("accept:%s", err.toString());
yamaguch 1:7350a2598a80 101 }
yamaguch 2:304672a01127 102 }
yamaguch 2:304672a01127 103
yamaguch 2:304672a01127 104 return NULL;
yamaguch 1:7350a2598a80 105 }
yamaguch 1:7350a2598a80 106
yamaguch 2:304672a01127 107 private:
yamaguch 2:304672a01127 108 int port;
yamaguch 2:304672a01127 109 TCPSocket ssocket; //The listening port where requests are queued
yamaguch 2:304672a01127 110 bool ssocketAcceptEvent;
yamaguch 2:304672a01127 111 };
yamaguch 1:7350a2598a80 112
yamaguch 1:7350a2598a80 113 int main() {
yamaguch 2:304672a01127 114 DigitalOut led1(LED1);
yamaguch 2:304672a01127 115 DigitalOut led2(LED2);
yamaguch 2:304672a01127 116 ServerSocket server(1234);
yamaguch 2:304672a01127 117 server.init();
yamaguch 1:7350a2598a80 118 Timer timer;
yamaguch 1:7350a2598a80 119 timer.start();
yamaguch 2:304672a01127 120
yamaguch 1:7350a2598a80 121 while (true) {
yamaguch 2:304672a01127 122 Net::poll();
yamaguch 2:304672a01127 123 if (ClientSocket *clientSocket = server.accept()) {
yamaguch 2:304672a01127 124 while (clientSocket->connected()) {
yamaguch 2:304672a01127 125 if (timer.read() > 10) {
yamaguch 2:304672a01127 126 timer.reset();
yamaguch 2:304672a01127 127 timer.start();
yamaguch 2:304672a01127 128 led1 = !led1;
yamaguch 2:304672a01127 129 }
yamaguch 2:304672a01127 130 }
yamaguch 2:304672a01127 131 }
yamaguch 2:304672a01127 132 if (timer.read() > 1) {
yamaguch 1:7350a2598a80 133 timer.reset();
yamaguch 2:304672a01127 134 timer.start();
yamaguch 2:304672a01127 135 led2 = !led2;
yamaguch 1:7350a2598a80 136 }
yamaguch 1:7350a2598a80 137 }
yamaguch 0:c41b68a4a296 138 }