nastaveni timeoutu pro connect()
David Rohleder
davro na ics.muni.cz
Pondělí Duben 23 23:26:12 CEST 2001
jikos na jikos.cz (Jirka Kosina) writes:
> Dobry den,
>
> > > Existuje nejaky rozmny zpusob, jak nastavit, po jake dobe se ma
> > > connect() na pripojovani vykaslat?
> > Zkuste pouzit non-blocking socket. Vice viz Unix socket FAQ
> > (http://www.faqs.org/faqs/unix-faq/socket/index.html), otazka
> > "How can I set the timeout for the connect() system call?"
>
> Diky, ale porad mam problem, kdyz se to snazim udelat pres ten select().
>
> Nicmene jak mi poradil Lubor Kolar (diky), lze to nastavit pomoci
> setsockopt() - ja jsem na tu funkci sice koukal, ale nevsiml jsem si
> SO_SNDTIMEO a SO_RCVTIMEO optionu. Je to nejakym zpusobem neciste, nebo
> proc to neni uvedeno v tom FAQu?
>
> Kdyz pouziju non-blocking socket a pak prislusny select, tak se to stejne
> chova zpusobem, ktery nechapu:
>
> Cast zdrojaku:
>
> [..]
> //nastavim socket jako non-blocking
> buf = fcntl(sockfd, F_GETFL);
> fcntl(sockfd, F_SETFL, buf | O_NONBLOCK);
> [..]
> connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
nemelo by tady byt FD_ZERO(&writefds); ?
> FD_SET(sockfd,&writefds);
> tval.tv_sec=10;tval.tv_usec=0;
> retval=select(sockfd+1,NULL,&writefds,NULL,&tval);
> if(!retval){printf("vyprsel cas\n");return(-1);}
> writestring(sockfd,"NEJAKA DATA\n");
> [..]
>
> A co na to strace:
>
> select(7, NULL, [6], NULL, {10, 0}) = 1 (out [6], left {10, 0})
> write(6, "NEJAKA DATA\n", 14) = 14
> read(6, 0xbffff95b, 1) = -1 EAGAIN (Resource temporarily
> unavailable)
>
--
-------------------------------------------------------------------------
David Rohleder davro na ics.muni.cz
Institute of Computer Science, Masaryk University
Brno, Czech Republic
-------------------------------------------------------------------------
Další informace o konferenci Linux