🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: es.comp.os.linux.programacion
Article #13117

Re: Buscando una primitiva de lectura de socket no bloqueante

#13117
From: cesar m. redondo
Date: Mon, 02 Apr 2001 13:35
59 lines
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-mail
References: <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