nastaveni timeoutu pro connect()

Jirka Kosina jikos na jikos.cz
Pondělí Duben 23 17:03:09 CEST 2001


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));
     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)

-- 
JiKos.



Další informace o konferenci Linux