Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
P
python mérés
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
blint-public
6. félév
Infokomm labor
python mérés
Commits
c9a5a436
Verified
Commit
c9a5a436
authored
3 years ago
by
Réthelyi Bálint
Browse files
Options
Downloads
Patches
Plain Diff
3 a
parent
8bc2e054
No related branches found
No related tags found
No related merge requests found
Pipeline
#20318
passed
3 years ago
Stage: build
Changes
4
Pipelines
1
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
README.md
+45
-1
45 additions, 1 deletion
README.md
solutions/2_feladat.md
+4
-3
4 additions, 3 deletions
solutions/2_feladat.md
solutions/3_feladat.md
+50
-0
50 additions, 0 deletions
solutions/3_feladat.md
time_server.py
+24
-0
24 additions, 0 deletions
time_server.py
with
123 additions
and
4 deletions
README.md
+
45
−
1
View file @
c9a5a436
...
@@ -167,3 +167,47 @@ Az alacsony-szintű hálózatkezelés (CPython és Linux környezet révén) a C
...
@@ -167,3 +167,47 @@ Az alacsony-szintű hálózatkezelés (CPython és Linux környezet révén) a C
ahol a nyelv a Linux socket-kezelő rendszerhívásait ajánlja ki. A követező kép ezt az alacsony-szintű TCP kommunikációt
ahol a nyelv a Linux socket-kezelő rendszerhívásait ajánlja ki. A követező kép ezt az alacsony-szintű TCP kommunikációt
és az ahhoz meghívandó függvényeket szemlélteti:
és az ahhoz meghívandó függvényeket szemlélteti:


-
[
time_server.py.txt
](
https://qosip.tmit.bme.hu/foswiki/pub/Meres/PythonFeladatok/time_server.py.txt2
)
:
Skeleton fájl a 3. feladathoz - Nevezd át!
HASZNOS PARANCSOK Előfordulhat a szkriptek futtatásánál, hogy a félkész kódok miatt a socket-ek beragadnak és
lefoglalják az adott portot/címet. Ekkor a még futó programokat manuálisan kell leállítanunk:
-
Nyitott portok listázása:
`$ netstat -tuplen`
(vagy
`ss -tulpn`
modernebb rendszereken - blint)
-
Futó Python programok kilistázása:
`$ ps auxf | grep python`
-
Program lelövése:
`$ sudo kill <PID> vagy a drasztikusabb $ sudo kill -9 <PID> `
## 3.a Feladat - Time szerver
**Feladat:**
Írjunk Python szkriptet
`time_server.py`
néven, ami megvalósít egy pontos időt visszaadó,
TCP alapú szerver funkciót. A szerver a kliensek kapcsolódása után szimplán adja vissza a pontos időt
(a klienseket külön szálon kezelve), majd bontsa a kapcsolatot. A megvalósításhoz használjuk a
Python magas-szintű
[
socketserver
](
https://docs.python.org/3.5/library/socketserver.html#socketserver-tcpserver-example
)
csomagjában definiált
`ThreadingTCPServer`
osztályt.
-
[
time_server.py.txt
](
https://qosip.tmit.bme.hu/foswiki/pub/Meres/PythonFeladatok/time_server.py.txt2
)
:
Skeleton fájl a 2. feladathoz
-
A szerver implementációkat és handler osztályokat a socketserver csomagban találjuk.
-
A szerver osztályok csak a kapcsolódást menedzselik a Python alacsony-szintű socket interfészén keresztül.
A kéréseket speciális
`RequestHandler`
osztályok kezelik le. Írjunk saját osztályt a kérések kezeléséhez,
amely a
`BaseRequestHandler`
osztályból származzon!
-
Nézzünk utána a server és handler osztályok kapcsolatának, működésének és a kérések kezelésének!
Definiáljuk felül a
`handle()`
metódust, amiben rögtön a kapcsolódás után adjuk vissza a pontos időt!
-
Üzenet küldéséhez használjuk a
`socket`
objektum
`sendall()`
metódusát.
Ne felejtsük el lezárni a kapcsolatot a válasz után (
`close()`
)!
-
A
`socket`
objektum a handler osztályban a
`request`
attribútumként érhető el.
-
A pontos idő visszaadásához használjuk a
`time`
csomagot (
`ctime()`
függvény)!
-
A socket kommunikációhoz
`bytes`
típusra konvertálás szükséges. Ehhez használjuk az
`str`
típus beépített
`encode()`
függvényét.
-
Ne felejtsük el elindítani a szervert a szkriptben, paraméterül megadva a (
*cím - port*
) tuple-t és a saját handler
osztályunkat!
**Ehhez példakódot találunk a `socketserver` modul dokumentációjában!**
-
A szerver IP címét és port számát kérjük be a szkript indítási paramétereként.
Ehhez használjuk a beépített
`argparse`
csomagot! Dokumentáció és példakódok:
[
argparse
](
https://docs.python.org/3.5/library/argparse.html
)
-
Minden beolvasott paraméter string! Port szám esetén explicite konvertáljuk az értéket
`int`
típusúra!
-
*Ctrl-C*
kombinációval való szabályos kilépéshez kezeljük le a dobott
`KeyboardInterrupt`
kivételt és állítsuk le
a szervert (
`server.shutdown()`
)!
-
Teszteléshez használjuk a
`telnet`
programot. Pl.:
`$ telnet localhost 8000`
This diff is collapsed.
Click to expand it.
solutions/2_feladat.md
+
4
−
3
View file @
c9a5a436
# 2. fealadat - Statisztika szkript
# 2. fealadat - Statisztika szkript
**Feladat:**
Készítsünk futtatható Python szkriptet
`mirror_stat.py`
néven, amely statisztikát készít megadott
Debian mirror szerverek elérhetőségéről, amit a futása végén ki is listáz!
A forráskód:
A forráskód:
...
@@ -26,7 +27,7 @@ def pingging(domains):
...
@@ -26,7 +27,7 @@ def pingging(domains):
for domain in domains:
for domain in domains:
stats[domain] = ping3.ping(domain)
stats[domain] = ping3.ping(domain)
# don't need sudo pr
e
v for this in a modern system
# don't need sudo pr
i
v for this in a modern system
return stats
return stats
...
@@ -47,7 +48,7 @@ if __name__ == '__main__':
...
@@ -47,7 +48,7 @@ if __name__ == '__main__':
Futtatás:
Futtatás:
```
bash
```
bash
$
./mirror_stat.py
# don't need sudo pr
e
v for this in a modern system
$
./mirror_stat.py
# don't need sudo pr
i
v for this in a modern system
{
'ftp.at.debian.org'
: 0.03299736976623535,
{
'ftp.at.debian.org'
: 0.03299736976623535,
'ftp.au.debian.org'
: 0.34027576446533203,
'ftp.au.debian.org'
: 0.34027576446533203,
'ftp.be.debian.org'
: 0.03146529197692871,
'ftp.be.debian.org'
: 0.03146529197692871,
...
...
This diff is collapsed.
Click to expand it.
solutions/3_feladat.md
0 → 100644
+
50
−
0
View file @
c9a5a436
# 3. Feladat - Hálózati kommunikáció - port szkenner
## 3.a Feladat - Time szerver
**Feladat:**
Írjunk Python szkriptet
`time_server.py`
néven, ami megvalósít egy pontos időt visszaadó,
TCP alapú szerver funkciót. A szerver a kliensek kapcsolódása után szimplán adja vissza a pontos időt
(a klienseket külön szálon kezelve), majd bontsa a kapcsolatot.
A forráskód:
```
python
#!/usr/bin/env python3
from
socketserver
import
BaseRequestHandler
,
ThreadingTCPServer
import
time
import
argparse
class
MyHandler
(
BaseRequestHandler
):
def
handle
(
self
):
self
.
request
.
sendall
(
str
.
encode
(
time
.
ctime
()))
if
__name__
==
"
__main__
"
:
parser
=
argparse
.
ArgumentParser
(
description
=
"
Time server
"
)
parser
.
add_argument
(
'
--ip
'
,
type
=
str
)
parser
.
add_argument
(
'
--port
'
,
type
=
int
)
args
=
parser
.
parse_args
()
a
=
vars
(
args
)
HOST
,
PORT
=
a
[
"
ip
"
],
int
(
a
[
"
port
"
])
server
=
ThreadingTCPServer
((
HOST
,
PORT
),
MyHandler
)
try
:
server
.
serve_forever
()
except
KeyboardInterrupt
:
server
.
shutdown
()
```
Futtatás:
```
bash
$
chmod
+x time_server.py
$
./time_server.py
--ip
=
"localhost"
--port
=
9999
```
Tesztelés:
```
bash
$
nc localhost 9999
Mon Mar 7 17:56:58 2022
```
\ No newline at end of file
This diff is collapsed.
Click to expand it.
time_server.py
0 → 100755
+
24
−
0
View file @
c9a5a436
#!/usr/bin/env python3
from
socketserver
import
BaseRequestHandler
,
ThreadingTCPServer
import
time
import
argparse
class
MyHandler
(
BaseRequestHandler
):
def
handle
(
self
):
self
.
request
.
sendall
(
str
.
encode
(
time
.
ctime
()))
if
__name__
==
"
__main__
"
:
parser
=
argparse
.
ArgumentParser
(
description
=
"
Time server
"
)
parser
.
add_argument
(
'
--ip
'
,
type
=
str
)
parser
.
add_argument
(
'
--port
'
,
type
=
int
)
args
=
parser
.
parse_args
()
a
=
vars
(
args
)
HOST
,
PORT
=
a
[
"
ip
"
],
int
(
a
[
"
port
"
])
server
=
ThreadingTCPServer
((
HOST
,
PORT
),
MyHandler
)
try
:
server
.
serve_forever
()
except
KeyboardInterrupt
:
server
.
shutdown
()
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment