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
_______________________________________________
Python mailing list
[email protected]
http://www.py.cz/mailman/listinfo/python

Odpovedet emailem