SimpleSocket 1.0 examples
Dependencies: EthernetNetIf SimpleSocket 1.0 mbed
main.cpp@2:304672a01127, 2011-08-16 (annotated)
- 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?
User | Revision | Line number | New 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 | } |