• Sábado 14 de Diciembre de 2024, 12:01

Autor Tema:  Logica de un programa  (Leído 1580 veces)

witchyfairy

  • Nuevo Miembro
  • *
  • Mensajes: 14
    • Ver Perfil
Logica de un programa
« en: Jueves 23 de Julio de 2009, 01:42 »
0
Hola chic@s quiero hacer una aplicacion con hilos y sockets en c++ pero no tengo muchas ideas que digamos ya !!!! Espero puedan ayudarme...
Se supone que el servidor estara corriendo en una maquina cuando un cliente se conecta le manda un hilo a cada cliente donde lo autentifica o lo registra y despues le manda una lista con los contactos que estan conectados.
Hasta aqui todo va bien y ya esta hecho pero ahora quiero que de esa lista el usuario decida con quien hablar y la comunicacion sea cliente- cliente y se olviden dle servidor :D como puedo lograr eso??? ALguien podria orientarme o darme una idea??
Gracias  :wub:

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Logica de un programa
« Respuesta #1 en: Jueves 23 de Julio de 2009, 08:06 »
0
Tenes dos opciones:

A. Los clientes se conectan entre si
B. El servidor redirige todos los mensajes entre los clientes, para eso necesitas algo que los identifique, como los nicks en el IRC

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.

Dsfase

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: Logica de un programa
« Respuesta #2 en: Jueves 23 de Julio de 2009, 10:47 »
0
Cita de: "witchyfairy"
Hola chic@s quiero hacer una aplicacion con hilos y sockets en c++ pero no tengo muchas ideas que digamos ya !!!! Espero puedan ayudarme...
Se supone que el servidor estara corriendo en una maquina cuando un cliente se conecta le manda un hilo a cada cliente donde lo autentifica o lo registra y despues le manda una lista con los contactos que estan conectados.
Hasta aqui todo va bien y ya esta hecho pero ahora quiero que de esa lista el usuario decida con quien hablar y la comunicacion sea cliente- cliente y se olviden dle servidor :D como puedo lograr eso??? ALguien podria orientarme o darme una idea??
Gracias  :wub:

¿Serías tan amable de poner el código de lo que llevas hecho?

Gracias.

witchyfairy

  • Nuevo Miembro
  • *
  • Mensajes: 14
    • Ver Perfil
Re: Logica de un programa
« Respuesta #3 en: Viernes 24 de Julio de 2009, 02:02 »
0
Hola!! Gracias por contestar, Eternal cuando dices que los clientes se comuniquen entre si quieres decir que se cree un nuevo socket para cada cliente (o sea crear un bind, listen, connect ) aqui esta el codigo!! BUeno esta es la parte del servidor:

Código: C++
  1. void AceptoConexiones(SOCKET Socket)
  2. {
  3.   SOCKET SockConexion;
  4.   SOCKADDR_IN DireccionLocal;
  5.   struct IP nuevaIP;
  6.   int tamano = sizeof(DireccionLocal),crear,no_cliente=0;
  7.   while(1){
  8.         no_cliente++;
  9.         SockConexion = accept (Socket, (struct sockaddr*)&DireccionLocal,&tamano);
  10.         mnsj =  mnsj + " nConexion entrante desde:n" + (String)inet_ntoa(DireccionLocal.sin_addr) + (String)(DireccionLocal.sin_port);
  11.         nuevaIP.IPDireccion = DireccionLocal;
  12.         nuevaIP.IPPuerto = DireccionLocal.sin_port;
  13.         nuevaIP.IPSocket = SockConexion;
  14.         nuevaIP.cliente = no_cliente;
  15.         lect_con = CreateThread(NULL, 0,(LPTHREAD_START_ROUTINE)Hilo_del_cliente,(void *)&nuevaIP,0,&Thread_lect);
  16.          }
  17.  
  18. }
  19. //----------------------------------------------------------------------------
  20. void *Hilo_del_cliente(void *nuevaIP){
  21.  
  22.      struct IP *nueva = (struct IP*)nuevaIP;
  23.      SOCKET RemoteSocket = nueva->IPSocket;
  24.      unsigned short portclient = nueva->IPPuerto;
  25.      SOCKADDR_IN DireccionLocal = nueva->IPDireccion;
  26.      String Usuario;
  27.      ShowMessage("Entre al hilo que atiende al cada cliente");
  28.      char buffer[1000],use[1000],usua[300],cont[300],idio[300],esta[300];
  29.      int nBytesSent;
  30.      int nBytesRecv;
  31.      int opcion,idi,est,existe;
  32.      struct nodo *nuev =NULL;
  33.      struct nodo *L;
  34.      ZeroMemory(buffer,1000);
  35.  
  36.        nBytesRecv = recv (RemoteSocket,(char *)&buffer, sizeof (buffer), 0);
  37.         mnsj =  mnsj + " nConexion entrante desde:n" + (String)inet_ntoa(DireccionLocal.sin_addr) + (String)portclient;
  38.         mnsj =  mnsj + "t recibi Opcion: " + buffer;
  39.         opcion = atoi(buffer);
  40.         //aqui el codigo del logeo ya lo hace  y todo esta bien
  41.         //me falta poner el del registro
  42.         switch(opcion)
  43.         {
  44.         case 1:
  45.         //lo de mensaje de usuario y todo eso solo lo puse para ver si llegaban los datos
  46.         recv (RemoteSocket,(char *)&buffer, sizeof (buffer), 0);
  47.         mnsj =  mnsj + "t recibi Usuario: " + buffer;
  48.         strcpy(usua,buffer);
  49.         recv (RemoteSocket,(char *)&buffer, sizeof (buffer), 0);
  50.         mnsj =  mnsj + "t recibi Pasword: " + buffer;
  51.         strcpy(cont,buffer);
  52.         recv (RemoteSocket,(char *)&buffer, sizeof (buffer), 0);
  53.         mnsj =  mnsj + "t recibi Nick: " + buffer;
  54.         strcpy(idio,buffer);
  55.         recv (RemoteSocket,(char *)&buffer, sizeof (buffer), 0);
  56.         mnsj =  mnsj + "t recibi Idioma: " + buffer;
  57.         strcpy(esta,buffer);
  58.         existe = validacion(usua,cont,idio,esta);
  59.         idi = atoi(idio);
  60.         est = atoi(esta);
  61.  
  62.         if (existe == 1)
  63.         {
  64.         ShowMessage("EXISTE Y LA CONTRASEÑA ES CORRECTA");
  65.         nuev = crea_nod(usua,usua,idi,est,portclient,lect_con,DireccionLocal,RemoteSocket);
  66.         //aqui es donde le mando la lista a el cliente pero se me bloquea y ninca llega, alguna idea de como mandar la lista de los contactos???
  67.         strcpy(buffer,"SI");
  68.         recv (RemoteSocket,(char *)&buffer, sizeof (buffer), 0);
  69.         }
  70.         else
  71.         {
  72.         ShowMessage("NO EXISTE FAVOR DE VERIFICAR LOS DATOS");
  73.   //aqui cuando le envio a el cliente el mensaje de que elcliente no esta logeado correctamente me manda un error o bien me manda numeros NO la cadena de caracteres que quiero
  74.         strcpy(buffer,"NO");
  75.         recv (RemoteSocket,(char *)&buffer, sizeof (buffer), 0);
  76.         }
  77.         break;
  78.  
  79.         case 2:
  80.         //registro
  81.         char nomb[60],appa[60],apma[60],ciud[60],pais[60],usua[60],cont[60],preg[60],resp[60],idio[60],diac[60],mesc[60],anioc[60],sexx[60],queryc[100];
  82.         int anac,mnac,dnac;
  83.         mnsj = "Estoy en la opcion2";
  84.         //aqui va el codigo del registro
  85.          break;
  86.  
  87.  
  88.          default:
  89.          ShowMessage("NO HAY NINGUNA OPCION");
  90.          }
  91.  
  92.  
  93. }
  94.  

Código: C++
  1. struct nodo *crea_nod(char *e_mail,char *Nick,int idioma,int status,unsigned short port,HANDLE hilo,SOCKADDR_IN DireccionCliente,SOCKET SockConexion){
  2.      struct nodo *nuevo;
  3.      nuevo = (struct nodo *)malloc(sizeof(struct nodo));
  4.      nuevo->User = e_mail;
  5.      nuevo->Nick = Nick;
  6.      nuevo->Idioma = idioma;
  7.      nuevo->Estado = status;
  8.      nuevo->Port = port;
  9.      nuevo->Hilo = hilo;
  10.      nuevo->DireccionCliente = DireccionCliente;
  11.      nuevo->SockConexion = SockConexion;
  12.      nuevo->sig =  NULL;
  13.   return nuevo;
  14. }
  15.  

Aqui funciona bien pero no entiendo como cada cliente se comunicara con otros clientes aqui esta el codigo del cliente:


Código: C++
  1. void __fastcall TForm1::BitBtn3Click(TObject *Sender)
  2. {
  3. if(Edit2->Text == "" || Edit3->Text == "" || ComboBox1->Text == "" || ComboBox2->Text == "")  {ShowMessage("Ingresa los datos completos");}
  4. else {
  5.   alias = Edit2->Text;
  6.   pass = Edit3->Text;
  7.   idioma = ComboBox1->Text;
  8.   if (idioma == "ESPAÑOL") {  idi = "1";  }
  9.   else if (idioma == "INGLES"){  idi = "2";  }
  10.   else  {   idi = "3";  }
  11.   estado = ComboBox2->Text;
  12.   if (estado == "CONECTADO") {  edo = "1";  }
  13.   else if (estado == "NO CONECTADO"){  edo = "2";  }
  14.   else  if (estado == "NO DISPONIBLE"){   edo = "3";  }
  15.   else{    edo = "4";  }
  16.   strcpy(aliasc,alias.c_str());
  17.   strcpy(passc,pass.c_str());
  18.   strcpy(idic,idi.c_str());
  19.   strcpy(edoc,edo.c_str());
  20.   //debo de mandar los datos anteriores para que el servidor me logee correctamente
  21.  strcpy(use,"1");
  22.  send(Sock_ser,(char*)&use,sizeof(use),0);
  23.  strcpy(use,aliasc);
  24.  mnsj = mnsj + "/n USUARIO" + (String)use;
  25.  send(Sock_ser,(char*)&use,sizeof(use),0);
  26.  strcpy(use,passc);
  27.  mnsj = mnsj + "/n PASS" + (String)use;
  28.  send(Sock_ser,(char*)&use,sizeof(use),0);
  29.  strcpy(use,idic);
  30.  mnsj = mnsj + "/n IDIOMA" + (String)use;
  31.  send(Sock_ser,(char*)&use,sizeof(use),0);
  32.  strcpy(use,edoc);
  33.  mnsj = mnsj + "/n ESTADO" + (String)use;
  34.  send(Sock_ser,(char*)&use,sizeof(use),0);
  35.  //aqui se me bloquea y no me llega nada :S
  36.  ShowMessage("Espero respuesta"); //Deberia de enviar el NO o bien SI para ver si esta logeada pero no lo hace en us lugar me envia numeros
  37.  recv(Sock_ser,(char*)&use,sizeof(use),0);
  38.  ShowMessage("Me enviaron algo" + (String)use );
  39.  
  40.  if (use == "SI")
  41.  {
  42.   ///se añade a la lsita de usuarios, PERO NO LOGRO PASARLA, en todo caso si se puede pasar aqui volveria a crear el procedimiento de el bind, listen y accept para cada cliente con el qu entable comunicacion????
  43.  }
  44.  else
  45.  {
  46.  
  47.  }
  48.  
  49.  }
  50. }
  51.  

BUeno quedo de ustedes muchas gracias!!!

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Logica de un programa
« Respuesta #4 en: Viernes 24 de Julio de 2009, 09:20 »
0
Si, sino todo tiene que pasar por el servidor, dale un ojeada al protocolo IRC, puede servirte de ayuda.

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.