Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Socket multi-accept

Estas en el tema de Socket multi-accept en el foro de C/C++ en Foros del Web. Buenas, tengo un problema medio raro, porque veo a todos con el mismo codigo y al parecer deberia de aceptar varios clientes.. Sever.cpp @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); ...
  #1 (permalink)  
Antiguo 14/04/2010, 08:49
Avatar de Fernand0  
Fecha de Ingreso: septiembre-2005
Ubicación: Buenos Aires
Mensajes: 610
Antigüedad: 19 años, 2 meses
Puntos: 19
Socket multi-accept

Buenas, tengo un problema medio raro, porque veo a todos con el mismo codigo y al parecer deberia de aceptar varios clientes..

Sever.cpp
Código C++:
Ver original
  1. void Server::Accept()
  2. {
  3.     int addrSize=sizeof(sockaddr_in);
  4.    
  5.     connectSocket=accept(mySocket, (SOCKADDR*)&connectAddress, &addrSize);
  6.    
  7.     if(connectSocket!=SOCKET_ERROR)
  8.     {
  9.         newSock=new Client(connectSocket, connectAddress);
  10.        
  11.         client.push(newSock);
  12.         sockHandler.set(mySocket);
  13.         sockHandler.push(newSock);
  14.        
  15.         //cout << "Query accepted from " << newSock->getIP() << "..." << endl;
  16.        
  17.         for(int i=0; i<client.Max(); ++i)
  18.             cout << "client[" << i << "]: " << client[i]->getSocket() << "..." << endl;
  19.     }
  20. }

return..
Cita:
client[0]: 144...
client[1]: 160...
No se superponen, el push se da perfectamente, el accept de los 2 clientes tambien.
Ahora el problema es que no tengo idea de porque dejo de recibir los mensajes del cliente #1 una vez que se conecta el cliente #2..

Socket.cpp
Código C++:
Ver original
  1. void Socket::nonBlocking()
  2. {
  3.     blocking=1;
  4.     ioctlsocket(mySocket, FIONBIO, &blocking);
  5. }


FD.cpp
Código C++:
Ver original
  1. int queries=select(mySocket+1, &readset, NULL, NULL, NULL);
  2.        
  3.         if(queries>0)
  4.             for(int i=0; i<max; ++i)
  5.             {
  6.                 SOCKET s0ck=sockList[i]->getSocket();
  7.                 if(FD_ISSET(s0ck, &readset))
  8.                 {
  9.                     cout << s0ck << " is in FD" << endl;
  10.                    
  11.                     int len=recv(s0ck, msg, KBPS, 0);
  12.                     if(len>0) msg[len]='\0';
  13.                 }
  14.                 else
  15.                     cout << s0ck << " is not in FD" << endl;
  16.             }

return..
Cita:
144 is not in FD
160 is in FD
En ninguna parte del codigo limpio el fd_set readset, asi que no se porque se superpone, o porque se limpia y luego se agregar el nuevo set..

Hay algo que me este perdiendo?
  #2 (permalink)  
Antiguo 18/04/2010, 03:20
Avatar de Fernand0  
Fecha de Ingreso: septiembre-2005
Ubicación: Buenos Aires
Mensajes: 610
Antigüedad: 19 años, 2 meses
Puntos: 19
Respuesta: Socket multi-accept

Yo de nuevo :P

Cambiando un poco el codigo me di cuenta de que el problema es que al usar el select con timeval, si no recibe ningun resultado, me va borrando los sockets de la lista, ahora bien, estuve buscando como evitar esto, y lo unico que se me ocurrio fue hacer una especie de "PING! PONG!"
O sea que enviaria al socket removido el mensaje "ping" y si recibo "pong" vuelve al listado, seria como para registar un estado idle, y si expira el plazo especifico sin recibir el "pong", simplemente que ejecute el closesocket

Si alguien sabe una mejor idea.. agradeceria que me la contaran

saludos!

Etiquetas: socket
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:26.