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