Ver Mensaje Individual
  #1 (permalink)  
Antiguo 14/04/2010, 08:49
Avatar de Fernand0
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?