<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>