Portál AbcLinuxu, 12. listopadu 2025 09:19
HOST = ''
PORT = 6001
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen()
print 'server ceka na pripojeni'
while 1:
conn, addr = s.accept()
print pripojen klient:', addr
while 1:
data = conn.recv(1024) *prijmu data
nejaka omacka co zpracuje dosla data
conn.send(pomsend) *poslu data
a problem je nasledujici, pokud clovek s terminalem odejde mimo dosah signalu, tak se nekdy stane ze server zustane viset (asi na recv()) a jedina moznost je ten programek sestrelit, pockat az upadne spojeni co je ve stavu fin_wait a pak ho pustit znovu.
Je nejaka moznost jak se tohoto chovani zbavit?
+ jak poznam kdy se client(wifi terminal) odpojil korektne?
struct timeval timeout;
/* set receive timeout to 1s */
timeout.tv_sec = 1;
timeout.tv_usec = 0;
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)
V pythonu budes muset pouzit
setsockopt(socket.SOL_SOCKET, socket.SO_RCVTIMEO, timeout)
Ten posledni parametr timeout bude string reprezentujici Cckovsky struct timeval. Viz. http://docs.python.org/lib/socket-objects.html
Bohuzel nemam moznost to vyzkouset.
tv = struct.pack('ii', int(timeout), int((timeout-int(timeout))*1e6))
setsockopt(socket.SOL_SOCKET, socket.SO_RCVTIMEO, tv)
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.