Portál AbcLinuxu, 12. května 2025 07:28

Dotaz: socket v pythonu

8.11.2007 10:20 kafcha | skóre: 1 | east
socket v pythonu
Přečteno: 462×
Odpovědět | Admin
zdravim, mam takovy problem ;] na zber dat pouzivame wifi terminaly, ke kterym jsem napsal maly 'server' v pythonu:
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?
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

8.11.2007 10:48 psonek | skóre: 20 | blog: psonek
Rozbalit Rozbalit vše Re: socket v pythonu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Socketu muzes pres set socket option nastavit recv timeout. Myslim, ze v pripade tech terminalu bude stacit 1s. Nevim presne jak to je v pythonu, ale obecne po 1s vylitne vyjimka nebo recv vrati 0 bytu. Pak muzes klientsky socket zavrit.

Co se tyce korektniho odpojeni, tak ja bych dodelal do te omacky nejakej prikaz, kterym klient pozada o ukonceni spojeni. Server po obdrzeni toho prikazu zavre socket a to samo udela klient.
8.11.2007 11:03 kafcha | skóre: 1 | east
Rozbalit Rozbalit vše Re: socket v pythonu
jdu vyzkouset ten timeout co se tyce toho korektniho odpojeni tak takhle to bohuzel nejde, jelikoz s klientem nic delat nemuzu ;[ spis me jde o to ze kdyz je ten terminal pripojenej, tak kdyz si dam vypsat spojeni v netstatu, tak ho tam vidim a pokud terminal vypnu, tak z vypisu netstatu zmizi, coz beru jako korektni ukonceni a jde mi o to, jestli tohle muzu nak poznat (naka vlastnost toho poslouchajiciho socketu? treba pocet pripojenych klientu ci neco takoveho)
8.11.2007 11:42 kafcha | skóre: 1 | east
Rozbalit Rozbalit vše Re: socket v pythonu
tak s tim nastaveni recv timeoutu bych potreboval pomoc, protoze netusim kde ci jak to nastavit. Kdyz pouziju settimeout(n) tak to je asi timeout u accept a to nepotrebuju
8.11.2007 13:15 psonek | skóre: 20 | blog: psonek
Rozbalit Rozbalit vše Re: socket v pythonu
Ja jsem bohuzel v pythonu nikdy neprogramoval. V C bys zavolal:
    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.
8.11.2007 17:16 kafcha | skóre: 1 | east
Rozbalit Rozbalit vše Re: socket v pythonu
tak se mi to nakonec podarilo udelat takhle tv = struct.pack('ii', int(timeout), int((timeout-int(timeout))*1e6)) setsockopt(socket.SOL_SOCKET, socket.SO_RCVTIMEO, tv)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.