[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