That’s the question I was waiting for.
Look the routine wich turnOn the listeners:
IPaddress ip;
Servidor.SocketSet = SDLNet_AllocSocketSet(QTD_MAX_CLIENTES+2);
if( !Servidor.SocketSet ) exit(-1);
if(SDLNet_ResolveHost(&ip, NULL, Config.Porta_Arcano) == -1) exit(-1);
Servidor.sckArcano = SDLNet_TCP_Open(&ip);
if( !Servidor.sckArcano ) exit(-1);
SDLNet_TCP_AddSocket(Servidor.SocketSet, Servidor.sckArcano);
Now, the NewClientAdmission routine:
void SRV_TestarSockets()
{
int rArc;
int i = 0;
rArc = SDLNet_CheckSockets(Servidor.SocketSet, 10);
if( rArc == -1 )
{
LOG_FRegistrar(“SDLNet_CheckSockets: %s\n”, SDLNet_GetError());
return;
}
if( !rArc )
return;
if( SDLNet_SocketReady(Servidor.sckArcano) )
{
SRV_Registrar_Arcano();
Servidor.HouveAtividade = 1;
return;
}
for(i=0; i<Servidor.ClientesConectados; i++)
{
if( SDLNet_SocketReady(Clientes[i].sckArcano) )
{
char msg[STR_100];
char str[STR_100];
int r;
memset(msg, 0, STR_100);
memset(str, 0, STR_100);
r = SDLNet_TCP_Recv(Clientes[i].sckArcano, msg, STR_100);
if( r == -1 )
{
SRV_DesconectarArcano(i);
Servidor.HouveAtividade = 1;
continue;
}
if( r == 0 )
{
SRV_DesconectarArcano(i);
Servidor.HouveAtividade = 1;
continue;
}
SRV_ExtrairComando(msg, str);
if( strlen(str) > 0 )
{
Servidor.HouveAtividade = 1;
SRV_InterpretarComando( i, str );
}
}
}
for(i=0; i<Servidor.ClientesConectados; i++)
{
if( SDLNet_SocketReady(Clientes[i].sckAcumulado) )
{
char msg[STR_100];
char str[STR_100];
int r;
memset(msg, 0, STR_100);
memset(str, 0, STR_100);
r = SDLNet_TCP_Recv(Clientes[i].sckAcumulado, msg, STR_100);
if( ( r == -1 ) || ( r == 0 ) )
{
Clientes[i].sckAcumulado = NULL;
continue;
}
SRV_ExtrairComando(msg, str);
if( strlen(str) > 0 )
{
SRV_InterpretarComando( i, str );
Servidor.HouveAtividade = 1;
}
}
}
}