Прикреплённый файл «2014-03-21-netsq.py»

Загрузка

   1 #!/usr/bin/env python
   2 # coding: utf
   3 '''
   4 Разработать протокол и написать сервер, решающий квадратные уравнения (пользователь подключается — хоть тем же netcat, вводит параметры квадратного уравнения, получает ответ) 
   5 2 ответа, один, решений нет, уравнение линейное, уравнение вырожденное + решений нет, уравнение вырожденное + решение любое)
   6 + с защитой от неправильного ввода (7-й вариант ответа)
   7 + с клиентом
   8 '''
   9 
  10 IPROTO={# message: values
  11         "ok": 0,
  12         "error": 1,
  13         "deginf": 0,
  14         "degzero": 0,
  15         "linear": 1,
  16         "no": 0,
  17         "one": 1,
  18         "two": 2,
  19         ".": 0,
  20 }
  21 
  22 OPROTO={#message: values
  23         "a": 1,
  24         "b": 1,
  25         "c": 1,
  26         "new": 0,
  27         ".": 0,
  28 }
  29 
  30 def solve(a,b,c):
  31     if a == b == c == 0: return ["deginf"]
  32     if a == b == 0: return ["degzero"]
  33     if a == 0: return ["linear", -c/b]
  34     d = b*b-4*a*c
  35     if d < 0: return ["no"]
  36     if d > 0: return ["two", (-b+d**0.5)/(2*a), (-b-d**0.5)/(2*a)]
  37     return ["one", -b/(2*a)]
  38 
  39 def parse(msg, PROTO):
  40     ret = msg.split()
  41     return ret and ret[0] in PROTO and len(ret) == 1+PROTO[ret[0]] and ret
  42 
  43 def oproto(conn):
  44     Params={"a": None, "b": None, "c": None}
  45     while True:
  46         data = conn.recv(1024).strip()
  47         if not data or data == ".": break
  48         reply = "ok"
  49         request = parse(data, OPROTO)
  50         if not request:
  51             reply = "error PARSE"
  52         elif request[0] == "new":
  53             Params={"a": None, "b": None, "c": None}
  54         else:
  55             try:
  56                 Params[request[0]] = float(request[1])
  57             except:
  58                 reply = "error PARAM"
  59             else:
  60                 if None not in Params.values():
  61                     ret = solve(Params["a"], Params["b"], Params["c"])
  62                     reply = " ".join(str(c) for c in ret)
  63         conn.sendall(reply+"\n")
  64     conn.close()
  65 
  66 DIAG={  "error": "Error occured",
  67         "deginf": "Degraded equation, infinite roots",
  68         "degzero": "Degraded equation, no root",
  69         "linear": "Linear equation",
  70         "no": "No root",
  71         "one": "One root",
  72         "two": "Two roots",
  73 }
  74 
  75 def iproto(conn, *args):
  76     for req in args:
  77         conn.sendall(req)
  78         data = conn.recv(1024).strip()
  79         if not data or data == ".": break
  80         reply = parse(data, IPROTO)
  81         if not reply:
  82             print >> sys.stderr, "Cannot parse server reply"
  83         else:
  84             if reply[0] in DIAG:
  85                 print "{}".format(DIAG[reply[0]]),
  86                 print " ".join(reply[1:])
  87     conn.sendall(".")
  88     conn.close()
  89 
  90 import sys, socket
  91 port = len(sys.argv)>1 and int(sys.argv[1]) or 2014
  92 host = len(sys.argv)>2 and sys.argv[2] or ''
  93 
  94 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  95 
  96 if host:
  97     s.connect((host,port))
  98     iproto(s, *sys.argv[3:])
  99 else:
 100     s.bind(('', port))
 101     s.listen(1)
 102     while True:
 103         conn, addr = s.accept()
 104         print "Connect",addr
 105         oproto(conn)
 106         print "Close",addr

Прикреплённые файлы

Для ссылки на прикреплённый файл в тексте страницы напишите attachment:имяфайла, как показано ниже в списке файлов. Не используйте URL из ссылки «[получить]», так как он чисто внутренний и может измениться.

Вам нельзя прикреплять файлы к этой странице.