Számítógépes Hálózatok GY 3-4.hét Laki Sándor ELTE-Ericsson Kommunikációs Hálózatok Laboratórium ELTE IK - Információs Rendszerek Tanszék lakis@elte.hu http://lakis.web.elte.hu 1
Teszt canvas.elte.hu Kód: 2
Python alapok III. Socket programozás 3
Pyton socket, host név feloldás Socket csomag használata gethostname() import socket gethostbyname() gethostbyname_ex() hostname = socket.gethostname() hostname = socket.gethostbyname( www.example.org ) hostname, aliases, addresses = socket.gethostbyname_ex(host) gethostbyaddr() hostname, aliases, addrs = socket.gethostbyaddr('157.181.161.79') 4
Feladat 1 Írassuk ki a gethosname() fv. eredményét! Következő hostnevekre futtassuk meg a gethostbyname() és a gethostbyname_ex() fv-eket: 'homer', 'www', 'www.python.org', inf.elte.hu Kérdezzük le a gethostbyaddr() fv segítségével a következő IP címek hosztneveit: 157.181.161.79, 157.181.161.16 5
Szerver adatok lekérdezése getaddrinfo() for response in socket.getaddrinfo('www.python.org', 'http'): family, socktype, proto, canonname, sockaddr = response for response in socket.getaddrinfo('www.python.org', 'http socket.af_inet, # family socket.sock_stream, # socktype socket.ipproto_tcp, # protocol socket.ai_canonname, # flags): family, socktype, proto, canonname, sockaddr = response 6
Feladat 2 Kérdezzük le a www.python.org http szerverének az információit! Kérdezzük le a www.inf.elte.hu oldal http servernevét, ahol meg van adva a név flag (AI_CANNONNAME) 7
Little endian, big endian 16 és 32 bites pozitív számok kódolása htons(), htonl() host to network short / long ntohs(), ntohl() network to host short / long 8
TCP 9
TCP socket() bind() listen() accept() sock = socket.socket(socket.af_inet, socket.sock_stream) server_address = ('localhost', 10000) sock.bind(server_address) sock.listen(1) connection, client_address = sock.accept() 10
TCP send(), sendall() recv() close() connect() connection.sendall(data) data = connection.recv(16) connection.close() server_address = ('localhost', 10000) sock.connect(server_address) 11
Feladat 3 Készítsünk egy egyszerű kliens-server alkalmazást, ahol a kliens elküld egy Hello server üzenetet, és a szerver pedig válaszol neki egy Hello kliens üzenettel! Változtassuk meg hogy ne az előre megadott portot adjuk, hanem egy tetszőlegeset kapjunk az oprendszertől! (sys.argv[1]) 12
Struktúra küldése Binárissá alakítjuk az adatot import struct values = (1, 'ab', 2.7) packer = struct.struct('i 2s f') packed_data = packer.pack(*values) #Int, char[2], float Visszalakítjuk a kapott üzenetet import struct unpacker = struct.struct('i 2s f') unpacked_data = unpacker.unpack(data) megj.: integer 1 4 byte, stringként 1 byte, azaz hatékonyabb stringként átküldeni. 13
Feladat 4 Készítsünk egy szerver-kliens alkalmazást, ahol a kliens elküld 2 számot és egy operátort a szervernek, amely kiszámolja és visszaküldi az eredményt. A kliens üzenete legyen struktúra. 14
Select setblocking() or settimeout() select() connection.setblocking(0) # or connection.settimeout(1.0) inputs = [ server ] outputs = [ ] timeout=1 readable, writable, exceptional = select.select(inputs, outputs, inputs, timeout) for s in readable: if s is server: #new client connect connection, client_address = server.accept() print('new client from %s:%d' % client_address) inputs.append( connection ) else:. #handle client 15
Órai feladat Fájl átvitel [4 pont] Készítsünk egy kliens-szerver alkalmazást, amely lehetőséget ad a szerveren levő fájlok és könyvtárszerkezet listázására és a fájlok letöltésére! A szerver funkciói: A szerver egy adott könyvtár alatti fájlok leöltését teszi lehetővé ezt konfigurációs paraméterként kell megadni A szerverhez egyszerre több kliens is csatlakozhat A kapcsolat felépítés után a kliensektől a következő üzeneteket fogadja el: DIR listázza a letöltési mappát a teljes könyvtárszerkezetet adja vissza. Találjon ki rá egy JSON struktúrát és abban küldje vissza a kliensnek a választ! DL <fájlnév elérési úttal> ha létezik a fájl a megfelelő elérési úton, a letöltési mappa alatt, akkor küldje át a fájl tartalmát. Ha nem létezik a fájl vagy az egy könyvtár, akkor jelezze a kliensnek. MODTIME <fájlnév elérési úttal> ha létezik a fájl a megfelelő elérési úton, akkor adja vissza, hogy mikor módosították utoljára. Ha nem létezik a fájl vagy az egy könyvtár, akkor jelezze a kliensnek. FIND <fájlnév> - Keresés fájlnévre. Ha létezik az adott névvel fájl a letöltési mappa valamely részén, akkor a teljes elérési utat adja vissza, ha nincs ilyen fájl, akkor azt is jelzi. A kliens funkciói: A kliens csatlakozik a szerverhez és bejelentkezve marad, majd egy konzolt ad a felhasználónak. A begépelt kérés üzenetet küldje el a szervernek. DIR, MODTIME és FIND esetén az eredményt a stdout-on jelenítse meg. DL esetén a fájl tartalmát mentse ki egy azonos nevű lokális fájlba (elérési utat nem kell legyártani, de le lehet.) EXIT parancsra bontsa a kapcsolatot és lépjen ki! 16
Vége Köszönöm a figyelmet! 17