[python] socket + udp + vytváření paketů

Jakub Vojáček jakohv na seznam.cz
Úterý Únor 21 23:17:37 CET 2012


Dne 21.2.2012 22:02, Jirka Vejrazka napsal(a):
> a) server neakceptuje UDP pakety, kde je identifikator spojeni a/nebo
> sekvencni cislo nastavene na
Pokud jsem dobře pochopil zadání tak:

"Iniciátorem spojení je vždy klient.
Klient pošle první datagram s příznakem SYN a s identifikátorem spojení, 
sekvenčním číslem a číslem potvrzení nastaveným na nulu. Datová část 
musí obsahovat právě 1 byte s kódem příkazu:"
> b) mas sitovy problem s odpovedi na UDP paket (viz muj predchozi mail).

Kód příkazu je dle specifikace 01h, což do 1byte myslím nenarvu. Ale 
pokud se podívám do referenční ukázky, tak oni tam při inicializiaci 
spojení posílají jako data "01" a ani když takto upravím struct.pack, 
tak od serveru nedostávám žádnou odpověd. Podle specifikace v zadání 
bych právě neměl dostat myslím žádnou odpověď, pokud přesně nestrefím 
první volání (přece jenom je to robotovi upadla anténa a musel se 
reebotovat bez nejakých komponent :-))

> Fantastické! Co to máte za učitele? To je nádhera. Učí stejně dobře jak
> píše zadání?
Jedná se o předmět Počítačové sítě a dělí se v podstatě na tři části
- přednášky - historie sítí, tenhle kabel vypadá takhle, stíněnej takhle
- semináře - konfigurace cisco routerů
- prosemináře - práce s adresami - výpočet masek, nat, ...
, přičemž každou část učí někdo jiný. Přednášející je uspávač hadů, ale 
ten kdo učí prosemináře se zdá, že tomu fakt rozumí a asi i píše i ty 
zadání. Takže ta programovací část předmětu je v podstatě takové 
samostudium. Nicméně je to, alespon pro mě, ta nejzábavnější část celého 
předmětu.
> Tak pošli celý kód.
#-*- coding: utf-8 -*-
import socket
import re
import time
import struct
import threading

class Listener(threading.Thread):
     def __init__(self, ip='baryk.fit.cvut.cz', port=4000):
         threading.Thread.__init__(self)
         self.ip = ip
         self.port = port

     def run(self):
         sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM )
         sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
         sock.connect((self.ip, self.port))
         while 1:
             data, from_ip = sock.recvfrom(1)
             print "data", data

x = Listener()
x.start()

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM )
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
data = struct.pack("!IHHB256s", 0, 0, 0, 1, "01")
s.bind(("",0))
s.sendto(data, ("baryk.fit.cvut.cz", 4000))

Děkuji

Jakub







------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://www.py.cz/pipermail/python/attachments/20120221/cccece14/attachment.html>


Další informace o konferenci Python