Socket server test

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?

UserRevisionLine numberNew 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(&eth);
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 }