Portál AbcLinuxu, 14. července 2025 06:42


Dotaz: connect timeout (socket)

22.9.2005 20:39 MaCrek
connect timeout (socket)
Přečteno: 401×
Odpovědět | Admin
Nazdarek,

Robim skriptik (klienta) v Cecku, ktory sa ma pripojit na server(iny ceckovy skript) a poslat niejake data. Problem nastane ak server je za firewallom. Klient sa zastavi pri connecte na server pomocou funkcie connect().

Vedel by niekto poradit ako tuto "udalost" osetrit ? Napr. zmenou timeoutu ?

Za kazdu radu vopred dakujem.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

22.9.2005 21:04 Michal Marek (twofish) | skóre: 55 | blog: { display: blog; } | Praha
Rozbalit Rozbalit vše Re: connect timeout (socket)
Odpovědět | | Sbalit | Link | Blokovat | Admin
Jde to tak, že nastavíš socket na neblokující (fcntl(s, F_SETFD, O_NONBLOCK)) a po connect() zavoláš poll nebo select. V man connect je to podrobněji:
EINPROGRESS
       The  socket  is  non-blocking  and the connection cannot be com-
       pleted immediately.  It is possible to select(2) or poll(2)  for
       completion  by  selecting  the  socket for writing. After select
       indicates writability, use getsockopt(2) to  read  the  SO_ERROR
       option  at  level  SOL_SOCKET  to determine whether connect com-
       pleted  successfully  (SO_ERROR  is  zero)   or   unsuccessfully
       (SO_ERROR  is one of the usual error codes listed here, explain-
       ing the reason for the failure).
22.9.2005 21:05 Michal Marek (twofish) | skóre: 55 | blog: { display: blog; } | Praha
Rozbalit Rozbalit vše Re: connect timeout (socket)
F_SETFL
24.9.2005 12:43 MaCrek
Rozbalit Rozbalit vše Re: connect timeout (socket)
Dakujem,

vyriesil som to tak. Ale potom ak je socket nastaveny na neblokujuci, musim pred kazdym read(recv) a write(send) volat select a osetrovat ho ? neda sa to nejak inak ? jednoduchsie ? :)
24.9.2005 12:56 Michal Marek (twofish) | skóre: 55 | blog: { display: blog; } | Praha
Rozbalit Rozbalit vše Re: connect timeout (socket)
Například ho nastavit zpátky na blokující (fcntl(s, F_SETFL, 0), resp fcntl(s, F_SETFL, fcntl(s, F_GETFL) & ~O_NONLBOCK)).
24.9.2005 13:32 MaCrek
Rozbalit Rozbalit vše Re: connect timeout (socket)
Diki moc,

hladal som v manuale ako zrusit blokujuci mod ale ... asi som hladal zle.
24.9.2005 13:39 Michal Marek (twofish) | skóre: 55 | blog: { display: blog; } | Praha
Rozbalit Rozbalit vše Re: connect timeout (socket)
No ono z fcntl(3) asi není moc jasné, že se nastaví právě ty flagy ve třetím argumentu, ale je to tak.
24.9.2005 13:45 MaCrek
Rozbalit Rozbalit vše Re: connect timeout (socket)
ja som hlavne nevedel ako zrusit O_NONBLOCK, diki

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.