2. gyakorlat
Mai tananyag: ~~suck it~~ socket
Kódolás
pl. chat app
- felhasználó: ki küldte - szám (azonosító)
- szöveg: mi az üzenet - szöveg
struct könyvtár
import struct
values = (1, 'ab'.encode(), 2.7)
packer = struct.Struct('i 2s f') # Int, char[2], float
packed_data = packer.pack(*values)
unpacker = struct.Struct('i 2s f')
unpacked_data = unpacker.unpack(packed_data)
Network encoding: big endian
százalékjel: !
network modea struct könyvtárban

import struct
# network order struct: int[3], char
packer = struct.Struct('! 3i b')
packer.pack(1,2,3,4)
!!! tip "Short-hand
```py
variables = (1, "foo".encode(), 2.0)
pack = struct.pack("i 3s f", *variables)
print(pack)
data = b"\x01\x00\x00\x00foo\x00\x00\x00\x00@"
unpacked = struct.unpack("i 3s f", data)
print(unpacked)
```
string:
packer = struct.Struct('! i 50p') # pascal szerű string (maximum 49 hosszú szöveg, a maradék string null-al lesz kibővítve, amit unpackkor elhagyhatunk)
packed = packer.pack(10, "teszt elek".encode())
packer = struct.Struct('! i 50s') # **pontosan** 50 hosszú string. (a maradék string null-al lesz kibővítve, unpackkor is !)
packed = packer.pack(10, "teszt elek".encode())
szam, szoveg = packer.unpack(packed)
szoveg.rstrip(b'\x00').decode()
discussion
- H: so why do s over p?
- H: only when you exactly know the len? which is hopefully always? szövegnél azért ritka len(str)
- D: a bájt tömbön???? ami után probably van más adat?
- H: inputról beszélek nem outputról :clueless:
- D: de inputnál igazából nincs probléma ott nem is kell tudnod kifejezetten a hosszt itt az a baj, hogy előre tudnod kell a hosszt, hogy dekódolni tudd
- D: true
- H: so then why does S exist mert a másik az null terminated, tehát egy bájtot mindenképpen elhasznál.
- D: ha viszont prefixálod a stringedet a string hosszal, akkor onnantól tudnád, hogy milyen hosszú a string. ott meg szar lenne a
p - H: that poor byte :c I feel sorry for it
fájlok and shit
with open('alma.txt', 'r') as f:
sor = f.readline()
print("első sor:", sor.strip())
sor = f.readline()
print("második sor:", sor.strip())
f.seek(0, 0) # f.seek(offset, whence)
sor = f.readline()
print("első sor megint:", sor.strip())
offset: olvasás/írás mutató pozíciója a fájlban
whence:
- 0: abszolút
- 1: relatív
- 2: relative to file's endf
import struct
packet = struct.Struct('i3si') # int, 3 hosszú string, int
with open('dates', 'wb') as f:
for i in range(5):
values = (2020 + i, b'jan', 10+i)
packed_data = packer.pack(*values)
f.write(packed_data)
with open('dates.bin', 'rb') as f:
f.seek(packer.sizze * 3)
data = f.read(packer.size)
print(packer.unpack(data))
socket
import socket
print(socket.gethostname()) # jelenlegi gép neve
print(socket.gethostbyname('inf.elte.hu')) # dns lekérdezés
print(socket.gethostbyname_ex('inf.elte.hu')) # even more data
print(socket.gethostbyaddr('157.181.1.232'))
1. feladat
import struct
import sys
import socket
packer = struct.Struct("20s i")
if len(sys.argv) <= 2:
print(socket.gethostname())
else:
row = int(sys.argv[2])
with open("domains.bin", 'rb') as f:
f.seek(packer. * row, 0)
data = f.read(packer.size)
domain, port = packer.unpack(data)
if sys.argv[1] == 'port':
print("port: ", port)
print("service: ", socket.getservbyport(port))
elif sys.argv[1] == 'domain':
domain = domain.rstrip(b'\x00')
domain = domain.decode()
print("domain: ", domain)
print("ip: ", socket.gethostbyname(domain))