Skip to content
Snippets Groups Projects
Verified Commit c9a5a436 authored by Réthelyi Bálint's avatar Réthelyi Bálint :no_mouth:
Browse files

3 a

parent 8bc2e054
No related branches found
No related tags found
No related merge requests found
Pipeline #20318 passed
...@@ -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:
![pic](https://qosip.tmit.bme.hu/foswiki/pub/Meres/PythonFeladatok/python_socket.jpg) ![pic](https://qosip.tmit.bme.hu/foswiki/pub/Meres/PythonFeladatok/python_socket.jpg)
- [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`
# 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 prev for this in a modern system # don't need sudo priv 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 prev for this in a modern system $ ./mirror_stat.py # don't need sudo priv 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,
......
# 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
#!/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()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment