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