Socket en espera

Iniciado por Lewert, 21 Abril 2009, 23:06 PM

0 Miembros y 1 Visitante están viendo este tema.

Lewert

Programando un pequeño programa en C me encontré con el problema de dejar un socket en "modo espera" para recibir datos. Alguien podria ayudarme? :-[
Gracias :-*
Crack the bytes, crack yourself

SirGraham

#1
Hola,

Lo mas lógico es usar un Bucle y en caso de no hacerlo "blockeante" (que supongo sera tu pregunta) es usar un thread (hilo) ....

Si nos comentas mas lo que quieres hacer....


Saludos,
Sir Graham.
   

Lewert

#2
Lo que me refiero es dejar el bucle en modo escucha, perdon por la confusion :-[ Para entendernos (no me riñas por la definicion, es para que te quede claro): una especie de hook que haga tal accion (esto no hace falta que me digas como :P) cuando, a traves de un socket, se reciban datos (texto o archivo).
Crack the bytes, crack yourself

SirGraham

Hola,

uhmmm... yo no he visto gestión "de Hooks" en las librerías de Socket: Poner una función de callback para eventos del tema.  Puedes en algunos sistemas operativos como el "ventanuco" interceptar el servicio de Winsock con un hook y controlar todos los sockets que se abren...

En el caso de un uso "normal": esto es controlar tus sockects desde tu propia aplicación, lo único que en teoría puedes hacer es un hilo de proceso a parte (un thread) que este testando si ha llegado información al socket. Para eso lo mas practico (que no indispensable) es hacer al socket "no bloqueante" y así puedes realizar las operaciones sin problemas...

¿Eso es lo que preguntas?

Saludos,
Sir Graham.
   

Lewert

Cita de: SirGraham en 22 Abril 2009, 20:27 PM
uhmmm... yo no he visto gestión "de Hooks" en las librerías de Socket: Poner una función de callback para eventos del tema.  Puedes en algunos sistemas operativos como el "ventanuco" interceptar el servicio de Winsock con un hook y controlar todos los sockets que se abren...
Lo de hooks era para que te hicieses una idea

Cita de: SirGraham en 22 Abril 2009, 20:27 PM
En el caso de un uso "normal": esto es controlar tus sockects desde tu propia aplicación, lo único que en teoría puedes hacer es un hilo de proceso a parte (un thread) que este testando si ha llegado información al socket. Para eso lo mas practico (que no indispensable) es hacer al socket "no bloqueante" y así puedes realizar las operaciones sin problemas...
Sí que es esto lo que quiero decir, lo que no entiendo es lo de hacer el socket "no bloqueante" :-\ No he oido nunca eso...
Crack the bytes, crack yourself

toxeek

#5
Que tal.

Resulta que hay syscalls como accept() que "bloquean". O sea, hasta que no le llega datos esta "bloqueando" y no se dara ninguna otra accion ya que esta el jodido accept() bloqueando /* read() tambien bloquea */

Para hacerlo "non-blocking" puedes hacer 2 cosas:

- una y menos "efectiva" seria usando la cabecera fcntl.h, y con la funcion fcnt() poner el socket ( descriptor ) en modo non-blocking. Creo que podria ser algo asi:

...
#include <fcntl.h>
...
int sock;
...

fcntl(sock, F_SETFL, O_NONBLOCK);

mirate en Google como poner el socket en modo non-blocking con fcntl().

- Otra y mas efectiva es usando select(). Linux-> man select
o Googlea.



Suerte.

  /**** MODIFIKO ****/

En realidad no se si es esto lo que necesitas, porque a mi parecer no has explicado bien cual es la verdadera raiz de tu problema.
"La envidia es una declaración de inferioridad"
Napoleón.

Lewert

Veamos, voy a intentar explicarlo un poco mejor.
En cualquier programa en Visual Basic con sockets existen los eventos "Data_Arrival", "Close", "Connect", "Accept", etc.. y dentro de cada evento escribes la funcion para cada caso. Por ejemplo, puedo programar para que cada vez que lleguen datos ("Data_Arrival"), la variable ExistenDatos pase a ser True.
Pues me gustaria hacer lo mismo en C con los sockets bluetooth :P
Alguna ayuda? :silbar:
Crack the bytes, crack yourself

SirGraham

#7
Hola,

Pues lo que te ha comentado averno.....  Esas funciones son perfectamente validas para los sockets que se usan en linux en BlueZ y en C/C++.

Aunque nosotros usamos las dos formas que comenta.

Con fcntl declaras no bloqueante.... y con el select puedes saber si el socket es esta preparado no para recibir datos... Todo esto metido en un thread....

No existen Callbacks que te "llamen" cuando se producen eventos en los sockets... tienes que estar tu comprobando constantemente el tema. Por eso el uso de threads...

Visual Basic (agggghhggggg!!!! que escalofrio me recorre la espalda)....

El VB te lo da todo echo. Pero el problema de eso es que si no tiene lo que necesitas, no puedes implementarlo "a parte".
En C/C++ lo tienes que hacer tu, pero tienes todo el control...

Aprender con Visual Basic a programar muchas veces puede ser un grave error...  :silbar: Te encubre todo el funcionamiento natural de las cosas...

La "gente adulta" programa con cosas serias como C, C++, Java... no "Visual Basic" (es una opinion personal  :P)

Saludos,
Sir Graham.
   

Lewert

Muchisimas gracias por las respuestas :P
Fuera del tema.. ya se que no existen hooks (o callbacks) que hagan eso, era para que os hicierais una idea :P
Tambien ya se que VB te limita mucho, pero no sabia explicar lo de los eventos de otra forma :xD
Gracias de nuevo ;D
Crack the bytes, crack yourself