Article View: es.comp.os.linux.programacion
Article #13117Re: Buscando una primitiva de lectura de socket no bloqueante
From: cesar m. redondo
Date: Mon, 02 Apr 2001 13:35
Date: Mon, 02 Apr 2001 13:35
59 lines
3373 bytes
3373 bytes
Si que existen y lo que tienes que hacer es lo siguiente:
#include <fcntl.h> // librer�a que necesitas
#include <sys/time.h>
int flag; // variable para recoger los flags del socket
int socket; // variable que contiene el descriptor del socket, (el entero que
devuelve la funci�n socket)
fd_set writefds,readfds; // estructuras necesarias para la funci�n select()
struct timeval tv; // estructura de tiempo necesaria para la funci�n select()
socket = socket(......);
.........
// una vez que ya tienes el socket creado y asociado con bind puedes hacer
flag = fcntl(socket,F_GETFL); // obtienes los flags asociados al socket
fcntl(l,F_SETFL,flag | O_NONBLOCK); // fijas el socket a estado no bloqueante
FD_ZERO(&readfds); // limpias la estructura
FD_SET(socket,&readfds); // introduces en la estructura el descriptor del
socket que vas a comprobar
tv.tv_sec=0; // fijas el tiempo que deseas que select() compruebe si hay algo
que leer
tv.tv_usec=5;
select(socket+1,&readfds,,NULL,NULL,&tv); // compruebas si hay algo que leer
en el socket
if(FD_ISSET(socket,&readfds)) // si hay algo que leer entras a leer sino pues
a hacer otra cosa
{
recv (socket,(char *) &sal, sizeof(double),0);
}
Te explico un poco la funci�n select(), esta funci�n comprueba durante el
tiempo que pongas en tv si se puede realizar una operaci�n en el descriptor que
le pases sin bloquear al programa. Par�metros:
select(socket+1, => (descriptor mas alto de los que deseas comprobar +1, es
decir si deseas comprobar el socket 122 y el 156 tienes que poner en este
parametro un 157)
&readfds, => (estructura con los descriptores que quieres
comprobar que se puede leer de ellos sin bloquear)
&writefds, => (estructura con los descriptores que quieres
comprobar que se puede escribir en ellos sin bloquear)
&excpfds, => (estructura con los descriptores que quieres
comprobar que estan en excepcion)
tv); => (tiempo qu edeseas esperar para ver si se puede realizar
alguna de las tres operaciones anteriores, si pones 0 en este tiempo select
retorna inmediatamente, si pones NULL select bloquea hasta que se pueda
realizar alguna de las tres operaciones anteriores en algun de los descriptores
introducisdos)
Con estas funciones puedes hacer lo que tu deseas, con fcntl pasas el socket a
no bloqueante y con select compruebas cuando tienes algo que leer.
Saludos.
Technical Details
Message-ID:
<3AC88015.795E789E@mad.tecsidel.es>Path:
arc1-ca.pugleaf.net!supernews.google.com!sn-xit-03!supernews.com!logbridge.uoregon.edu!news.rediris.es!news-2.rediris.es!tidos.tid.es!not-for-mailReferences:
<99rj2v$2iq6e$1@ID-81973.news.dfncis.de>Show Full Headers
Complete Article Headers
X-Google-Language: SPANISH,ASCII X-Google-Thread: f86c8,cfe4f18a9b910c33 X-Google-Attributes: gidf86c8,public X-Google-ArrivalTime: 2001-04-02 07:22:01 PST Path: arc1-ca.pugleaf.net!supernews.google.com!sn-xit-03!supernews.com!logbridge.uoregon.edu!news.rediris.es!news-2.rediris.es!tidos.tid.es!not-for-mail From: "cesar m. redondo" <cesar.redondo@mad.tecsidel.es> Newsgroups: es.comp.os.linux.programacion Subject: Re: Buscando una primitiva de lectura de socket no bloqueante Date: Mon, 02 Apr 2001 15:35:17 +0200 Organization: Telefonica I+D Lines: 63 Message-ID: <3AC88015.795E789E@mad.tecsidel.es> References: <99rj2v$2iq6e$1@ID-81973.news.dfncis.de> NNTP-Posting-Host: 172.18.70.44 Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Mailer: Mozilla 4.61 [en] (X11; I; Linux 2.2.12-20 i686) X-Accept-Language: es