<html>
  <head>
    <meta content="text/html; charset=ISO-8859-2"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000099">
    Zdravím,<br>
    <br>
    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á. <br>
    <br>
    #-*- coding: utf-8 -*-
<br>
    import socket
<br>
    import re
<br>
    import time
<br>
    import struct
<br>
    import threading<br>
    import time<br>
    <br>
    class Server:<br>
        def __init__(self, host = "", port = 4000):<br>
            self.conn_id = False<br>
                   <br>
            self.s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM )
<br>
            self.s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,
    1)
<br>
            self.s.bind(("",0))   <br>
            <br>
            self.receiver = Receiver(self.s, self.read) <br>
            self.receiver.start()<br>
            <br>
            for x in range(20):<br>
                if self.conn_id != False:<br>
                    break<br>
                data = struct.pack("!IHHBB", 0, 0, 0, 1, 1)
<br>
                self.s.sendto(data, ("localhost", 4000))<br>
                time.sleep(0.1)<br>
            <br>
            if self.conn_id == False:<br>
                print "SERVER NEODPOVEDEL NA SYN"<br>
                print "nyní je třeba nějak donutit Receiver, aby se
    ukončil"<br>
                #self.s.close()<br>
                return<br>
        def read(self, data):<br>
            #parsuje data a přečte z nich conn_id a nastaví self.conn_id
    na nějaké číslo<br>
            pass<br>
    <br>
    class Receiver(threading.Thread):<br>
        def __init__(self, s, callback):<br>
            threading.Thread.__init__(self)<br>
            self.s = s<br>
            self.callback = callback<br>
        def run(self):<br>
            while 1:
<br>
                data, from_ip = self.s.recvfrom(265)           
<br>
                if not data:
<br>
                    break<br>
    <br>
                self.callback(data)<br>
    <br>
    <br>
    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.<br>
    <br>
    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ě.<br>
    <br>
    Děkuji za Vaše nápady,<br>
    <br>
    Jakub<br>
  </body>
</html>