![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Socket server test
main.cpp@4:19dd8a25cc8a, 2016-08-25 (annotated)
- Committer:
- Colin Hogben
- Date:
- Thu Aug 25 18:43:08 2016 +0100
- Revision:
- 4:19dd8a25cc8a
- Parent:
- 0:d2e0685698cc
- Child:
- 5:2c2f993df16b
Report stats; add config
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
infinnovation | 0:d2e0685698cc | 1 | #include "mbed.h" |
infinnovation | 0:d2e0685698cc | 2 | #include "EthernetInterface.h" |
Colin Hogben |
4:19dd8a25cc8a | 3 | #include "lwip/stats.h" |
infinnovation | 0:d2e0685698cc | 4 | |
infinnovation | 0:d2e0685698cc | 5 | #ifndef SRV_PORT |
infinnovation | 0:d2e0685698cc | 6 | #define SRV_PORT 8084 |
infinnovation | 0:d2e0685698cc | 7 | #endif |
infinnovation | 0:d2e0685698cc | 8 | |
Colin Hogben |
4:19dd8a25cc8a | 9 | Serial pc(USBTX, USBRX); |
infinnovation | 0:d2e0685698cc | 10 | EthernetInterface eth; |
infinnovation | 0:d2e0685698cc | 11 | |
Colin Hogben |
4:19dd8a25cc8a | 12 | Thread stats_thread; |
Colin Hogben |
4:19dd8a25cc8a | 13 | |
Colin Hogben |
4:19dd8a25cc8a | 14 | void stats_main(void) |
Colin Hogben |
4:19dd8a25cc8a | 15 | { |
Colin Hogben |
4:19dd8a25cc8a | 16 | int i; |
Colin Hogben |
4:19dd8a25cc8a | 17 | while (true) { |
Colin Hogben |
4:19dd8a25cc8a | 18 | int c = pc.getc(); |
Colin Hogben |
4:19dd8a25cc8a | 19 | switch (c) { |
Colin Hogben |
4:19dd8a25cc8a | 20 | default: printf("lwip statistics: *=all" |
Colin Hogben |
4:19dd8a25cc8a | 21 | " l=LINK a=ETHARP" |
Colin Hogben |
4:19dd8a25cc8a | 22 | " i=IP f=IPFRAG c=ICMP g=IGMP" |
Colin Hogben |
4:19dd8a25cc8a | 23 | " u=UDP t=TCP" |
Colin Hogben |
4:19dd8a25cc8a | 24 | " h=HEAP m=MEMP* p=PCB n=NETBUF/NETCONN" |
Colin Hogben |
4:19dd8a25cc8a | 25 | " s=SYS\n"); break; |
Colin Hogben |
4:19dd8a25cc8a | 26 | case '*': stats_display(); break; |
Colin Hogben |
4:19dd8a25cc8a | 27 | case 'l': LINK_STATS_DISPLAY(); break; |
Colin Hogben |
4:19dd8a25cc8a | 28 | case 'a': ETHARP_STATS_DISPLAY(); break; |
Colin Hogben |
4:19dd8a25cc8a | 29 | case 'f': IPFRAG_STATS_DISPLAY(); break; |
Colin Hogben |
4:19dd8a25cc8a | 30 | case 'i': IP_STATS_DISPLAY(); break; |
Colin Hogben |
4:19dd8a25cc8a | 31 | case 'c': ICMP_STATS_DISPLAY(); break; |
Colin Hogben |
4:19dd8a25cc8a | 32 | case 'g': IGMP_STATS_DISPLAY(); break; |
Colin Hogben |
4:19dd8a25cc8a | 33 | case 'u': UDP_STATS_DISPLAY(); break; |
Colin Hogben |
4:19dd8a25cc8a | 34 | case 't': TCP_STATS_DISPLAY(); break; |
Colin Hogben |
4:19dd8a25cc8a | 35 | case 'h': MEM_STATS_DISPLAY(); break; |
Colin Hogben |
4:19dd8a25cc8a | 36 | case 'm': for (i=0; i < MEMP_MAX; i++) MEMP_STATS_DISPLAY(i); break; |
Colin Hogben |
4:19dd8a25cc8a | 37 | case 'p': |
Colin Hogben |
4:19dd8a25cc8a | 38 | MEMP_STATS_DISPLAY(MEMP_UDP_PCB); |
Colin Hogben |
4:19dd8a25cc8a | 39 | MEMP_STATS_DISPLAY(MEMP_TCP_PCB); |
Colin Hogben |
4:19dd8a25cc8a | 40 | MEMP_STATS_DISPLAY(MEMP_TCP_PCB_LISTEN); |
Colin Hogben |
4:19dd8a25cc8a | 41 | break; |
Colin Hogben |
4:19dd8a25cc8a | 42 | case 'n': |
Colin Hogben |
4:19dd8a25cc8a | 43 | MEMP_STATS_DISPLAY(MEMP_NETBUF); |
Colin Hogben |
4:19dd8a25cc8a | 44 | MEMP_STATS_DISPLAY(MEMP_NETCONN); |
Colin Hogben |
4:19dd8a25cc8a | 45 | break; |
Colin Hogben |
4:19dd8a25cc8a | 46 | case 's': SYS_STATS_DISPLAY(); break; |
Colin Hogben |
4:19dd8a25cc8a | 47 | } |
Colin Hogben |
4:19dd8a25cc8a | 48 | } |
Colin Hogben |
4:19dd8a25cc8a | 49 | } |
Colin Hogben |
4:19dd8a25cc8a | 50 | |
infinnovation | 0:d2e0685698cc | 51 | void tcp_echo_conn(TCPSocket *sock) |
infinnovation | 0:d2e0685698cc | 52 | { |
Colin Hogben |
4:19dd8a25cc8a | 53 | static char buf[5000]; |
infinnovation | 0:d2e0685698cc | 54 | int ret; |
infinnovation | 0:d2e0685698cc | 55 | while (true) { |
infinnovation | 0:d2e0685698cc | 56 | ret = sock->recv(buf, sizeof(buf)); |
infinnovation | 0:d2e0685698cc | 57 | if (ret < 0) { |
infinnovation | 0:d2e0685698cc | 58 | error("recv: %d", ret); |
infinnovation | 0:d2e0685698cc | 59 | } else if (ret == 0) { |
infinnovation | 0:d2e0685698cc | 60 | printf("recv: EOF\r\n"); |
infinnovation | 0:d2e0685698cc | 61 | delete sock; |
infinnovation | 0:d2e0685698cc | 62 | break; |
infinnovation | 0:d2e0685698cc | 63 | } else { |
infinnovation | 0:d2e0685698cc | 64 | ret = sock->send(buf, ret); |
infinnovation | 0:d2e0685698cc | 65 | if (ret < 0) { |
infinnovation | 0:d2e0685698cc | 66 | error("send: %d", ret); |
infinnovation | 0:d2e0685698cc | 67 | } |
infinnovation | 0:d2e0685698cc | 68 | } |
infinnovation | 0:d2e0685698cc | 69 | } |
infinnovation | 0:d2e0685698cc | 70 | } |
infinnovation | 0:d2e0685698cc | 71 | |
infinnovation | 0:d2e0685698cc | 72 | void tcp_echo(TCPServer *srv) |
infinnovation | 0:d2e0685698cc | 73 | { |
infinnovation | 0:d2e0685698cc | 74 | int err; |
infinnovation | 0:d2e0685698cc | 75 | while (true) { |
infinnovation | 0:d2e0685698cc | 76 | TCPSocket *sock = new TCPSocket; |
infinnovation | 0:d2e0685698cc | 77 | err = srv->accept(sock); |
infinnovation | 0:d2e0685698cc | 78 | if (err) error("accept: %d\r\n", err); |
infinnovation | 0:d2e0685698cc | 79 | printf("accepted connection\r\n"); |
infinnovation | 0:d2e0685698cc | 80 | Thread *conn_thread = new Thread; |
infinnovation | 0:d2e0685698cc | 81 | conn_thread->start(Callback<void()>(sock, tcp_echo_conn)); |
infinnovation | 0:d2e0685698cc | 82 | } |
infinnovation | 0:d2e0685698cc | 83 | } |
infinnovation | 0:d2e0685698cc | 84 | |
infinnovation | 0:d2e0685698cc | 85 | int main(void) |
infinnovation | 0:d2e0685698cc | 86 | { |
infinnovation | 0:d2e0685698cc | 87 | int err; |
infinnovation | 0:d2e0685698cc | 88 | printf("\r\n== socket-test %s ==\r\n", __DATE__); |
Colin Hogben |
4:19dd8a25cc8a | 89 | stats_init(); |
Colin Hogben |
4:19dd8a25cc8a | 90 | stats_thread.start(stats_main); |
infinnovation | 0:d2e0685698cc | 91 | err = eth.connect(); |
infinnovation | 0:d2e0685698cc | 92 | if (err) error("connect: %d\n", err); |
infinnovation | 0:d2e0685698cc | 93 | printf("ip %s\r\n", eth.get_ip_address()); |
infinnovation | 0:d2e0685698cc | 94 | TCPServer srv; |
infinnovation | 0:d2e0685698cc | 95 | err = srv.open(ð); |
infinnovation | 0:d2e0685698cc | 96 | if (err) error("open: %d\r\n", err); |
infinnovation | 0:d2e0685698cc | 97 | err = srv.bind(SRV_PORT); |
infinnovation | 0:d2e0685698cc | 98 | if (err) error("bind: %d\r\n", err); |
Colin Hogben |
4:19dd8a25cc8a | 99 | err = srv.listen(0); |
infinnovation | 0:d2e0685698cc | 100 | if (err) error("listen: %d\r\n", err); |
infinnovation | 0:d2e0685698cc | 101 | Thread srv_thread; |
infinnovation | 0:d2e0685698cc | 102 | srv_thread.start(Callback<void()>(&srv, tcp_echo)); |
infinnovation | 0:d2e0685698cc | 103 | |
infinnovation | 0:d2e0685698cc | 104 | while (true) { |
infinnovation | 0:d2e0685698cc | 105 | wait(1.0); |
infinnovation | 0:d2e0685698cc | 106 | } |
Colin Hogben |
4:19dd8a25cc8a | 107 | } |