Прикреплённый файл «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 из ссылки «[получить]», так как он чисто внутренний и может измениться.- [получить | показать] (2014-03-28 00:01:02, 0.7 KB) [[attachment:2014-03-21-netcat.py]]
- [получить | показать] (2014-03-28 00:00:53, 3.2 KB) [[attachment:2014-03-21-netsq.py]]
Вам нельзя прикреплять файлы к этой странице.