Tests for the NetworkSocketAPI
Dependents: BSDInterfaceTests ESP8266InterfaceTests LWIPInterfaceTests SpwfInterface_NSAPI_Tests ... more
EchoServer.py@11:fbfe3498404a, 2016-05-10 (annotated)
- Committer:
- c1728p9
- Date:
- Tue May 10 21:38:38 2016 -0500
- Revision:
- 11:fbfe3498404a
- Parent:
- 4:b52f17273177
- Child:
- 12:152ae238ddc1
Add support for IPv6
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Christopher Haster |
4:b52f17273177 | 1 | #!/usr/bin/env python |
Christopher Haster |
4:b52f17273177 | 2 | import socket |
Christopher Haster |
4:b52f17273177 | 3 | import signal |
Christopher Haster |
4:b52f17273177 | 4 | import select |
Christopher Haster |
4:b52f17273177 | 5 | |
Christopher Haster |
4:b52f17273177 | 6 | |
Christopher Haster |
4:b52f17273177 | 7 | def main(port): |
Christopher Haster |
4:b52f17273177 | 8 | port = int(port) |
Christopher Haster |
4:b52f17273177 | 9 | |
Christopher Haster |
4:b52f17273177 | 10 | udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) |
Christopher Haster |
4:b52f17273177 | 11 | udp.bind(('', port)) |
Christopher Haster |
4:b52f17273177 | 12 | udp.setblocking(0) |
Christopher Haster |
4:b52f17273177 | 13 | udp.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) |
Christopher Haster |
4:b52f17273177 | 14 | |
Christopher Haster |
4:b52f17273177 | 15 | tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM) |
Christopher Haster |
4:b52f17273177 | 16 | tcp.bind(('', port)) |
Christopher Haster |
4:b52f17273177 | 17 | tcp.setblocking(0) |
Christopher Haster |
4:b52f17273177 | 18 | tcp.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) |
Christopher Haster |
4:b52f17273177 | 19 | tcp.listen(5) |
Christopher Haster |
4:b52f17273177 | 20 | |
c1728p9 | 11:fbfe3498404a | 21 | udp6 = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM) |
c1728p9 | 11:fbfe3498404a | 22 | udp6.bind(('', port)) |
c1728p9 | 11:fbfe3498404a | 23 | udp6.setblocking(0) |
c1728p9 | 11:fbfe3498404a | 24 | udp6.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) |
c1728p9 | 11:fbfe3498404a | 25 | |
c1728p9 | 11:fbfe3498404a | 26 | tcp6 = socket.socket(socket.AF_INET6, socket.SOCK_STREAM) |
c1728p9 | 11:fbfe3498404a | 27 | tcp6.bind(('', port)) |
c1728p9 | 11:fbfe3498404a | 28 | tcp6.setblocking(0) |
c1728p9 | 11:fbfe3498404a | 29 | tcp6.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) |
c1728p9 | 11:fbfe3498404a | 30 | tcp6.listen(5) |
c1728p9 | 11:fbfe3498404a | 31 | |
Christopher Haster |
4:b52f17273177 | 32 | print "running on port %d" % port |
c1728p9 | 11:fbfe3498404a | 33 | sockets = [tcp, udp, tcp6, udp6] |
Christopher Haster |
4:b52f17273177 | 34 | clients = [] |
Christopher Haster |
4:b52f17273177 | 35 | |
Christopher Haster |
4:b52f17273177 | 36 | while True: |
Christopher Haster |
4:b52f17273177 | 37 | select.select(sockets, [], []) |
Christopher Haster |
4:b52f17273177 | 38 | |
Christopher Haster |
4:b52f17273177 | 39 | try: |
Christopher Haster |
4:b52f17273177 | 40 | data, addr = udp.recvfrom(1 << 12) |
Christopher Haster |
4:b52f17273177 | 41 | print 'udp %s:%d %d' % (addr[0], addr[1], len(data)) |
Christopher Haster |
4:b52f17273177 | 42 | udp.sendto(data, addr) |
Christopher Haster |
4:b52f17273177 | 43 | except socket.error: |
Christopher Haster |
4:b52f17273177 | 44 | pass |
Christopher Haster |
4:b52f17273177 | 45 | |
Christopher Haster |
4:b52f17273177 | 46 | try: |
Christopher Haster |
4:b52f17273177 | 47 | client, addr = tcp.accept() |
Christopher Haster |
4:b52f17273177 | 48 | print 'tcp %s:%d connect' % (addr[0], addr[1]) |
Christopher Haster |
4:b52f17273177 | 49 | client.setblocking(0) |
Christopher Haster |
4:b52f17273177 | 50 | client.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) |
Christopher Haster |
4:b52f17273177 | 51 | sockets.append(client) |
Christopher Haster |
4:b52f17273177 | 52 | clients.append((client, addr)) |
Christopher Haster |
4:b52f17273177 | 53 | except socket.error: |
Christopher Haster |
4:b52f17273177 | 54 | pass |
Christopher Haster |
4:b52f17273177 | 55 | |
c1728p9 | 11:fbfe3498404a | 56 | try: |
c1728p9 | 11:fbfe3498404a | 57 | data, addr = udp6.recvfrom(1 << 12) |
c1728p9 | 11:fbfe3498404a | 58 | print 'udp6 %s:%d %d' % (addr[0], addr[1], len(data)) |
c1728p9 | 11:fbfe3498404a | 59 | udp6.sendto(data, addr) |
c1728p9 | 11:fbfe3498404a | 60 | except socket.error: |
c1728p9 | 11:fbfe3498404a | 61 | pass |
c1728p9 | 11:fbfe3498404a | 62 | |
c1728p9 | 11:fbfe3498404a | 63 | try: |
c1728p9 | 11:fbfe3498404a | 64 | client, addr = tcp6.accept() |
c1728p9 | 11:fbfe3498404a | 65 | print 'tcp6 %s:%d connect' % (addr[0], addr[1]) |
c1728p9 | 11:fbfe3498404a | 66 | client.setblocking(0) |
c1728p9 | 11:fbfe3498404a | 67 | client.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) |
c1728p9 | 11:fbfe3498404a | 68 | sockets.append(client) |
c1728p9 | 11:fbfe3498404a | 69 | clients.append((client, addr)) |
c1728p9 | 11:fbfe3498404a | 70 | except socket.error: |
c1728p9 | 11:fbfe3498404a | 71 | pass |
c1728p9 | 11:fbfe3498404a | 72 | |
Christopher Haster |
4:b52f17273177 | 73 | for client, addr in clients: |
Christopher Haster |
4:b52f17273177 | 74 | try: |
Christopher Haster |
4:b52f17273177 | 75 | data = client.recv(1 << 12) |
Christopher Haster |
4:b52f17273177 | 76 | if data: |
Christopher Haster |
4:b52f17273177 | 77 | print 'tcp %s:%d %d' % (addr[0], addr[1], len(data)) |
Christopher Haster |
4:b52f17273177 | 78 | client.send(data) |
Christopher Haster |
4:b52f17273177 | 79 | else: |
Christopher Haster |
4:b52f17273177 | 80 | print 'tcp %s:%d disconnect' % (addr[0], addr[1]) |
Christopher Haster |
4:b52f17273177 | 81 | sockets.remove(client) |
Christopher Haster |
4:b52f17273177 | 82 | clients.remove((client, addr)) |
Christopher Haster |
4:b52f17273177 | 83 | client.close() |
Christopher Haster |
4:b52f17273177 | 84 | except socket.error: |
Christopher Haster |
4:b52f17273177 | 85 | pass |
Christopher Haster |
4:b52f17273177 | 86 | |
Christopher Haster |
4:b52f17273177 | 87 | |
Christopher Haster |
4:b52f17273177 | 88 | if __name__ == "__main__": |
Christopher Haster |
4:b52f17273177 | 89 | import sys |
Christopher Haster |
4:b52f17273177 | 90 | main(*sys.argv[1:]) |