Programación General > C/C++

 Logica de un programa

(1/1)

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:

Eternal Idol:
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

Dsfase:

--- 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:
--- Fin de la cita ---

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

Gracias.

witchyfairy:
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++ ---void AceptoConexiones(SOCKET Socket){  SOCKET SockConexion;  SOCKADDR_IN DireccionLocal;  struct IP nuevaIP;  int tamano = sizeof(DireccionLocal),crear,no_cliente=0;  while(1){        no_cliente++;        SockConexion = accept (Socket, (struct sockaddr*)&DireccionLocal,&tamano);        mnsj =  mnsj + " nConexion entrante desde:n" + (String)inet_ntoa(DireccionLocal.sin_addr) + (String)(DireccionLocal.sin_port);        nuevaIP.IPDireccion = DireccionLocal;        nuevaIP.IPPuerto = DireccionLocal.sin_port;        nuevaIP.IPSocket = SockConexion;        nuevaIP.cliente = no_cliente;        lect_con = CreateThread(NULL, 0,(LPTHREAD_START_ROUTINE)Hilo_del_cliente,(void *)&nuevaIP,0,&Thread_lect);         } }//----------------------------------------------------------------------------void *Hilo_del_cliente(void *nuevaIP){      struct IP *nueva = (struct IP*)nuevaIP;     SOCKET RemoteSocket = nueva->IPSocket;     unsigned short portclient = nueva->IPPuerto;     SOCKADDR_IN DireccionLocal = nueva->IPDireccion;     String Usuario;     ShowMessage("Entre al hilo que atiende al cada cliente");     char buffer[1000],use[1000],usua[300],cont[300],idio[300],esta[300];     int nBytesSent;     int nBytesRecv;     int opcion,idi,est,existe;     struct nodo *nuev =NULL;     struct nodo *L;     ZeroMemory(buffer,1000);        nBytesRecv = recv (RemoteSocket,(char *)&buffer, sizeof (buffer), 0);        mnsj =  mnsj + " nConexion entrante desde:n" + (String)inet_ntoa(DireccionLocal.sin_addr) + (String)portclient;        mnsj =  mnsj + "t recibi Opcion: " + buffer;        opcion = atoi(buffer);        //aqui el codigo del logeo ya lo hace  y todo esta bien        //me falta poner el del registro        switch(opcion)        {        case 1:        //lo de mensaje de usuario y todo eso solo lo puse para ver si llegaban los datos        recv (RemoteSocket,(char *)&buffer, sizeof (buffer), 0);        mnsj =  mnsj + "t recibi Usuario: " + buffer;        strcpy(usua,buffer);        recv (RemoteSocket,(char *)&buffer, sizeof (buffer), 0);        mnsj =  mnsj + "t recibi Pasword: " + buffer;        strcpy(cont,buffer);        recv (RemoteSocket,(char *)&buffer, sizeof (buffer), 0);        mnsj =  mnsj + "t recibi Nick: " + buffer;        strcpy(idio,buffer);        recv (RemoteSocket,(char *)&buffer, sizeof (buffer), 0);        mnsj =  mnsj + "t recibi Idioma: " + buffer;        strcpy(esta,buffer);        existe = validacion(usua,cont,idio,esta);        idi = atoi(idio);        est = atoi(esta);         if (existe == 1)        {        ShowMessage("EXISTE Y LA CONTRASEÑA ES CORRECTA");        nuev = crea_nod(usua,usua,idi,est,portclient,lect_con,DireccionLocal,RemoteSocket);        //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???        strcpy(buffer,"SI");        recv (RemoteSocket,(char *)&buffer, sizeof (buffer), 0);        }        else        {        ShowMessage("NO EXISTE FAVOR DE VERIFICAR LOS DATOS");  //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        strcpy(buffer,"NO");        recv (RemoteSocket,(char *)&buffer, sizeof (buffer), 0);        }        break;         case 2:        //registro        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];        int anac,mnac,dnac;        mnsj = "Estoy en la opcion2";        //aqui va el codigo del registro         break;           default:         ShowMessage("NO HAY NINGUNA OPCION");         }  } 

--- Código: C++ ---struct nodo *crea_nod(char *e_mail,char *Nick,int idioma,int status,unsigned short port,HANDLE hilo,SOCKADDR_IN DireccionCliente,SOCKET SockConexion){     struct nodo *nuevo;     nuevo = (struct nodo *)malloc(sizeof(struct nodo));     nuevo->User = e_mail;     nuevo->Nick = Nick;     nuevo->Idioma = idioma;     nuevo->Estado = status;     nuevo->Port = port;     nuevo->Hilo = hilo;     nuevo->DireccionCliente = DireccionCliente;     nuevo->SockConexion = SockConexion;     nuevo->sig =  NULL;  return nuevo;} 
Aqui funciona bien pero no entiendo como cada cliente se comunicara con otros clientes aqui esta el codigo del cliente:



--- Código: C++ ---void __fastcall TForm1::BitBtn3Click(TObject *Sender){if(Edit2->Text == "" || Edit3->Text == "" || ComboBox1->Text == "" || ComboBox2->Text == "")  {ShowMessage("Ingresa los datos completos");}else {  alias = Edit2->Text;  pass = Edit3->Text;  idioma = ComboBox1->Text;  if (idioma == "ESPAÑOL") {  idi = "1";  }  else if (idioma == "INGLES"){  idi = "2";  }  else  {   idi = "3";  }  estado = ComboBox2->Text;  if (estado == "CONECTADO") {  edo = "1";  }  else if (estado == "NO CONECTADO"){  edo = "2";  }  else  if (estado == "NO DISPONIBLE"){   edo = "3";  }  else{    edo = "4";  }  strcpy(aliasc,alias.c_str());  strcpy(passc,pass.c_str());  strcpy(idic,idi.c_str());  strcpy(edoc,edo.c_str());  //debo de mandar los datos anteriores para que el servidor me logee correctamente strcpy(use,"1"); send(Sock_ser,(char*)&use,sizeof(use),0); strcpy(use,aliasc); mnsj = mnsj + "/n USUARIO" + (String)use; send(Sock_ser,(char*)&use,sizeof(use),0); strcpy(use,passc); mnsj = mnsj + "/n PASS" + (String)use; send(Sock_ser,(char*)&use,sizeof(use),0); strcpy(use,idic); mnsj = mnsj + "/n IDIOMA" + (String)use; send(Sock_ser,(char*)&use,sizeof(use),0); strcpy(use,edoc); mnsj = mnsj + "/n ESTADO" + (String)use; send(Sock_ser,(char*)&use,sizeof(use),0); //aqui se me bloquea y no me llega nada :S 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 recv(Sock_ser,(char*)&use,sizeof(use),0); ShowMessage("Me enviaron algo" + (String)use );  if (use == "SI") {  ///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???? } else {  }  }} 
BUeno quedo de ustedes muchas gracias!!!

Eternal Idol:
Si, sino todo tiene que pasar por el servidor, dale un ojeada al protocolo IRC, puede servirte de ayuda.

Navegación

[0] Índice de Mensajes

Ir a la versión completa