Domingo 15 de Diciembre de 2024, 08:51
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
select en sockets non-blocking
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: select en sockets non-blocking (Leído 1460 veces)
diego.martinez
Miembro MUY activo
Mensajes: 297
select en sockets non-blocking
«
en:
Lunes 12 de Enero de 2009, 10:49 »
0
Buenas:
estoy haciendo una comunicación UDP entre 2 equipos. Cuando se produce un evento, el equipo A manda una trama UDP al equipo B que esta en escucha con Bind.
Uso select para ver si tengo que hacer recv en el recepctor. Y aqui viene el problema, el receptor a pesar de tener un sleep , me consume el 98% de la CPU. Alguien sabe que hago mal?
Os pongo el codigo.
Código: Text
//este es el bucle de mensajeria de windows
while (!this->IsFinished() && !this->IsRestarting())
{
this->Messager(); //translate message, dispatch etc...
this->UDPServer->Poll();
Sleep(this->Main_Sleep); //vale 1 MainSleep
}
y este es el UDPServer
Código: Text
int appIP::InitHost()
{
//creamos un socket para UDP
this->Socket=socket(AF_INET, SOCK_DGRAM, 0);
if (this->Socket==SOCKET_ERROR) return 1;
//limpiamos nuestra address para hacer de host
memset((void *)&Host, ' ', sizeof(struct sockaddr_in));
/* Set family and port */
Host.sin_family = AF_INET;
Host.sin_port = htons(Port);
/* Get host name of this computer */
gethostname(host_name, sizeof(host_name));
HostProperties = gethostbyname(host_name); //cojemos el nombre de la maquina local
/* Check for NULL pointer */
if (HostProperties == NULL)
return 1;
/* Assign the address */
Host.sin_addr.S_un.S_un_b.s_b1 = HostProperties->h_addr_list[0][0];
Host.sin_addr.S_un.S_un_b.s_b2 = HostProperties->h_addr_list[0][1];
Host.sin_addr.S_un.S_un_b.s_b3 = HostProperties->h_addr_list[0][2];
Host.sin_addr.S_un.S_un_b.s_b4 = HostProperties->h_addr_list[0][3];
/*tenemos la ip , hagamosla string*/
sprintf(StringIP,"%d.%d.%d.%d",Host.sin_addr.S_un.S_un_b.s_b1,Host.sin_addr.S_un.S_un_b.s_b2,Host.sin_addr.S_un.S_un_b.s_b3,Host.sin_addr.S_un.S_un_b.s_b4);
TimeOut.tv_usec = msTimeout%1000;
TimeOut.tv_sec = msTimeout/1000; // Time in seconds
FD_ZERO (&fdSocket);
FD_SET (Socket, &fdSocket); //ponemos el socket en vigilancia
if (bind(Socket, (struct sockaddr *)&Host, sizeof(struct sockaddr_in)) == -1)
{
return 1;
}
return 0;
}
Y este es el polling del select.
Código: Text
void appIP::Poll()
{
unsigned int bytes_received=0;
int AddrSize=(int)sizeof(struct sockaddr_in);
this->fdSocket.fd_count = 1;
if (
select(0,&this->fdSocket,0,0,&this->TimeOut) > 0 //hay notificacion
&&
FD_ISSET (this->Socket, &this->fdSocket) //y es nuestro socket
)
{
bytes_received = recvfrom(this->Socket,(char*) this->Buffer, 100, 0, (struct sockaddr *)&this->Ext, &AddrSize);
if (bytes_received>0)
{
if (this->Events["receive"]!=NULL) this->Events["receive"](this);
}
}
}
no se, al select le he puesto un time out de 1 ms para que la mitad del tiempo este durmiendo la cpu, asi que deberia ir relajado. Quizas estoy manejando mal el select?
gracias por anticipado.
Tweet
Eternal Idol
Moderador
Mensajes: 4696
Nacionalidad:
Re: select en sockets non-blocking
«
Respuesta #1 en:
Lunes 12 de Enero de 2009, 10:57 »
0
¿Probaste con 100 en lugar de 1 en ambos (milisegundos)?
Nacional y Popular
En mi país la bandera de Eva es inmortal.
Queremos una Argentina socialmente justa, económicamente libre y políticamente soberana.
¡Perón cumple, Evita dignifica!
La mano invisible del mercado me robo la billetera.
diego.martinez
Miembro MUY activo
Mensajes: 297
Re: select en sockets non-blocking
«
Respuesta #2 en:
Lunes 12 de Enero de 2009, 12:28 »
0
gracias por la respuesta.
Pues si, lo probé y seguia igual de mal. Al final buscando he encontrado el fallo:
Código: Text
u_long iMode = 1; // <------ el fallo es que no habia entendido bien que parametro se pasaba como iMode.
ioctlsocket (Socket, FIONBIO, &iMode);
En la espec pone que iMode debe ser distinto de 0 para que sean non-blocking. Bien la cosa es que se refieren al valor interno, no a la direccion (pensaba que era que si le pasabas null seria blocking) pero hay que poner iMode a 1 para que sean non-blocking de verdad, asi que con eso se solucionó.
Gracias igualmente. Nos vemos.
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
select en sockets non-blocking