Advertisement
rfmonk

tcp_deadlock.py

Jan 24th, 2014
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.69 KB | None | 0 0
  1. #!/usr/bin/env python
  2.  
  3. # TCP client and server that leave
  4. # too much data waiting. From Foundations
  5.  
  6. import socket
  7. import sys
  8.  
  9. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  10.  
  11. HOST = '127.0.0.1'
  12. PORT = 1060
  13.  
  14. if sys.argv[1:] == ['server']:
  15.     s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  16.     s.bind((HOST, PORT))
  17.     s.listen(1)
  18.     while True:
  19.         print 'Listening at', s.getsockname()
  20.         sc, sockname = s.accept()
  21.         print 'Processing up to 1024 bytes at a time from', sockname
  22.         n = 0
  23.         while True:
  24.             message = sc.recv(1024)
  25.             if not message:
  26.                 break
  27.             sc.sendall(message.upper())
  28.             n += len(message)
  29.             print '\r%d bytes processed so far' % (n,),
  30.             sys.stdout.flush()
  31.         print
  32.         sc.close()
  33.         print 'Completed processing'
  34.  
  35. elif len(sys.argv) == 3 and sys.argv[1] == 'client' and sys.argv[2].isdigit():
  36.     bytes = (int(sys.argv[2]) + 15) // 16 * 16
  37.     message = 'capitalize this!'
  38.     print 'Sending', bytes, 'bytes if data, in chunks of 16 bytes'
  39.     s.connect((HOST, PORT))
  40.     sent = 0
  41.     while sent < bytes:
  42.         s.sendall(message)
  43.         sent += len(message)
  44.         print '\r%d bytes sent' % (sent,),
  45.         sys.stdout.flush()
  46.  
  47.     print
  48.     s.shutdown(socket.SHUT_WR)
  49.     print 'Receiving all the data the server sends back'
  50.     received = 0
  51.     while True:
  52.         data = s.recv(42)
  53.         if not received:
  54.             print 'The first data received says', repr(data)
  55.         received += len(data)
  56.         if not data:
  57.             break
  58.         print '\r%d bytes received' % (received,),
  59.     s.close()
  60.  
  61. else:
  62.     print >>sys.stderr, 'usage: tcp_deadlock.py server | client <bytes>'
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement