[python] socket + udp + vytváření paketů
Jakub Vojáček
jakohv na seznam.cz
Úterý Únor 28 13:29:43 CET 2012
Zdravím,
opět jsem narazil na problém při práci na tomto úkolu. Download dat ze
serveru včetně ošetřených ztracených paket i již funguje, ale zatím jsem
přijímání i odesílání paketů řešil v jenom threadu. Jenomže dle zadání
je na začátku spojení poslat serveru SYN paket a server musí odpovědět
také SYN paketem se číslem spojení. Ale server může simulovat ztrátu
mého paketu a proto musí můj klient posílat SYN paket celkem 20x, než
spojení definitivně uzavře. Udělal jsem tedy aplikaci dvouvláknovou -
jedno vlákno přijímá zprávy ze serveru a druhé je posílá.
#-*- coding: utf-8 -*-
import socket
import re
import time
import struct
import threading
import time
class Server:
def __init__(self, host = "", port = 4000):
self.conn_id = False
self.s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM )
self.s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.s.bind(("",0))
self.receiver = Receiver(self.s, self.read)
self.receiver.start()
for x in range(20):
if self.conn_id != False:
break
data = struct.pack("!IHHBB", 0, 0, 0, 1, 1)
self.s.sendto(data, ("localhost", 4000))
time.sleep(0.1)
if self.conn_id == False:
print "SERVER NEODPOVEDEL NA SYN"
print "nyní je třeba nějak donutit Receiver, aby se ukončil"
#self.s.close()
return
def read(self, data):
#parsuje data a přečte z nich conn_id a nastaví self.conn_id na
nějaké číslo
pass
class Receiver(threading.Thread):
def __init__(self, s, callback):
threading.Thread.__init__(self)
self.s = s
self.callback = callback
def run(self):
while 1:
data, from_ip = self.s.recvfrom(265)
if not data:
break
self.callback(data)
Problém je tedy v tom, že Reveiver čeká na nějaká data
(self.s.recvfrom(265)), jenomže tyhle data teoreticky nemusejí přijít a
po 20x odeslání SYN je třeba nějak z této naslouchací smyčky vyskočit a
program ukončit.
Napadlo mě volat self.s.close(), což vyvolá vyjímku, jenomže se mi to
nezdá jako úplně čisté řešení. Snad jsem se vyjádřil srozumitelně.
Děkuji za Vaše nápady,
Jakub
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://www.py.cz/pipermail/python/attachments/20120228/0c408d0a/attachment.html>
Další informace o konferenci Python