nastaveni timeoutu pro connect()

Pavel Kankovsky peak na argo.troja.mff.cuni.cz
Čtvrtek Duben 26 01:41:52 CEST 2001


On Mon, 23 Apr 2001, Jirka Kosina wrote:

> Kdyz pouziju non-blocking socket a pak prislusny select, tak se to stejne
> chova zpusobem, ktery nechapu:
...
> [..]
>      connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
>      FD_SET(sockfd,&writefds);

pred tim FD_SET opravdu asi chybi FD_ZERO (muze to zdanlive fungovat i
bez toho, protoze tam nahodou jsou na zacatku nuly)

>      tval.tv_sec=10;tval.tv_usec=0;
>      retval=select(sockfd+1,NULL,&writefds,NULL,&tval);
>      if(!retval){printf("vyprsel cas\n");return(-1);}

tohle je otazka, nakolik je to ciste...specialne zde chybi osetreni
moznosti retval < 0 (a napr. errno == EINTR)

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

co je na tom nesrozumitelneho? volate read() na non-blocking socket, ktery
nema po ruce zadna data, a proto vrati EAGAIN (vulgo EWOULDBLOCK)

bud je treba za prenastavit zpatky na blocking, nebo s nim zachazet podle
toho, ze je n.-b., cili delat select()

--Pavel Kankovsky aka Peak  [ Boycott Microsoft--http://www.vcnet.com/bms ]
"Resistance is futile. Open your source code and prepare for assimilation."



Další informace o konferenci Linux