Kihagyás

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 mode a struct könyvtárban

Formázó karakterek

Formázó karakterek spoiler

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))