 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Manolo Invitado
|
Publicado: Mar 11 Jun, 2002 11:19 pm Asunto: enviar y recibir mensajes por la red interna |
|
|
| Hola a todos Necesito realizar una aplicación que envie mensajes por la red interna a todas las máquinas que estén escuchado, y otra aplicación para recibir este mensaje, me ha dicho que use el procolo UDP para enviar el mensaje. Nunca he realizado algo por el estilo y no se como comunicar los ordenadores en red mediante builder. Por favor pido un poquito de orientación sobre el tema gracias Saludos Manolo. |
|
| Volver arriba |
|
 |
jaquemate Invitado
|
Publicado: Vie 14 Jun, 2002 12:41 am Asunto: enviar y recibir mensajes por la red interna |
|
|
| Puedes utilizar CORBA para comunicar dos aplicaciones. En resumidas cuentas, con CORBA puedes acceder al servidor como si se tratara de un objeto. La ventaja de esto es que es multiplataforma e independiente del lenguaje. Deberás asegurarte de tener instalado el Visibroker (incluido en la versión Professional) que es el ORB de C y Java que incluye C++ Builder. Te recomiendo el libro Programación avanzada con C++ Builder de Francisco Charte en que te explica en profundidad como hacer esto. Otra forma mucho más fácil, es utilizar sockets. Necesitarás un componente TServerSocket en el servidor y un TClientSocket en el cliente. Configuras el puerto y la dirección del servidor en el cliente y con el método SendText() del cliente, envías un mensaje en forma de cadena AnsiString al servidor. El servidor, recibe un evento OnClientRead y en ese evento utilizas el método ReceiveText() del TServerSocket para recibir el mensaje que envió el cliente. Parece fácil ¿no? En fin, espero que te haya servido de ayuda... |
|
| Volver arriba |
|
 |
Manolo Invitado
|
Publicado: Vie 14 Jun, 2002 7:17 am Asunto: enviar y recibir mensajes por la red interna |
|
|
| Hola jaquemate He estado mirando el ejemplo del chat que biene cono el builder y me he decidido por la segunda opción que me comentaste, pero haciendo pruebas me han surguido unas preguntas a ver si alguien me puede ayudar: 1.- Cuando esta corriento el serividor y se conectan los clientes, el programa va estupendo, pero cuando el servidor cierra la conexión o termina el programa los clientes no me detectan que no hay servidor. 2.- En el nombre del puerto estoy usando el 1024 ( el que biene en el ejemplo del chat), ¿ como puede afectar el cambio de este puerto ? o ¿ como saber si hay algún programa , en la máquina del servidor, que use ese puerto ? Gracios y Saludos de Manolo |
|
| Volver arriba |
|
 |
jose manuel Invitado
|
Publicado: Vie 14 Jun, 2002 8:43 am Asunto: enviar y recibir mensajes por la red interna |
|
|
Hola, por fin puedo ayudar! Verás, Manolo. Supongo que la aplicación servidor llevará una lista de los clientes que tiene conectados, con su dirección IP. Entonces a la hora de cerrar la aplicación servidor, p.ej. en el evento FormDestroy, programas un bucle que recorra toda la lista y envíe un código (el que quierar) que cuando lo reciba cada cliente entienda que el servidor se cerró (es decir, se produce una desconexión entre cliente y servidor). ¿Lo has entendido? Saludos, |
|
| Volver arriba |
|
 |
jose manuel Invitado
|
Publicado: Vie 14 Jun, 2002 8:47 am Asunto: enviar y recibir mensajes por la red interna |
|
|
| Más. Yo uso los eventos de los objetos NMMsg y NMMSGServ y simplemente con PostIt(String), puedo enviar lo que yo quiera. Saludos, |
|
| Volver arriba |
|
 |
jaquemate Invitado
|
Publicado: Sab 15 Jun, 2002 4:49 pm Asunto: enviar y recibir mensajes por la red interna |
|
|
| El TClientSocket tiene un evento llamado OnDisconnect que se produce cuando se produce una desconexión ya sea por parte del cliente o del servidor. Por lo tanto, si se cierra el programa servidor cuando los clientes están conectados, se producirá el evento OnDisconnect en todos y cada uno de los clientes que estuvieran conectados´. Te aconsejo que utilices números de puerto mayores que 1024, ya que los primeros están reservados a Internet. Y por supuesto que no esté utilizandose por otro servidor. Puedes hacer "netstat -a" en el símbolo del sistema para saber los puertos que están siendo utilizados. Para saber si el servidor se está ejecutando desde el cliente, puedes intentar la conexión del cliente en la dirección y puerto especificado. Si la conexión falla es porque el servidor no está escuchando y se producirá el evento OnError del TClientSocket.
|
|
| Volver arriba |
|
 |
Manolo Invitado
|
Publicado: Lun 17 Jun, 2002 12:49 pm Asunto: enviar y recibir mensajes por la red interna |
|
|
| Gracias a los dos Ya usabe el evento OnError, pero dentro de el lo estaba usando mal, creo que ya he arreglado ese problema, una cosa cuando al servidor se le desconecta odesconecta él, el último cliente, este si se desconeta pero me dice que tiene aún una conexion ??? Pongo el codigo que uso: void __fastcall TForm1::ServidorClientConnect(TObject *Sender, TCustomWinSocket *Socket) { int i; AnsiString texto= Socket->RemoteHost; for (i=0;i< ListaDeClientes->Items->Count;i++){ if(texto == ListaDeClientes->Items->Strings[i]){ Socket->Disconnect(Socket->SocketHandle); break; } } if(i == ListaDeClientes->Items->Count){ ListaDeClientes->Items->Add(texto); Label1->Caption=IntToStr(Servidor->Socket->ActiveConnections); } } Os comentento , cuando se conecta un nuevo servidor compruebo si ya ha establecido conexión ( no se porque en un principio una misma máquina se conectaba 2 o 3 veces), encaso de ser así lo desconecto, sino lo añado a mi Lista de conexiones ( me refiero a la visual, el componente ya lo hace solo). //********************************* void __fastcall TForm1::ServidorClientDisconnect(TObject *Sender,TCustomWinSocket *Socket) { AnsiString texto; int i; texto = Socket->RemoteHost; for (i=0;i< ListaDeClientes->Items->Count;i++){ if(texto == ListaDeClientes->Items->Strings[i]){ ListaDeClientes->Items->Delete(i); break; } } Label1->Caption=IntToStr(Servidor->Socket->ActiveConnections); } Basicamente lo que hago es buscar el nombre del cliente que ha realizado la descnonexión y lo borro de la lista y actualizo el número de conexiones que se encuentran activas, pero esta se mantiene a 1 cuando se desconecta la última conexión. Alguna idea?? Por cierto que relevacia puede tener el que otro program (o servidor ) esté usando el mismo número del puerto y como puedo saber que puertos tengo disponible, es decir como me habeis indicado con netstat -a puedo conocer que puertos se están usando, pero como puedo conocer que puertos no tengo usados, cual es el rango. Saludos Manolo |
|
| Volver arriba |
|
 |
jaquemate Invitado
|
Publicado: Mar 18 Jun, 2002 3:16 pm Asunto: enviar y recibir mensajes por la red interna |
|
|
| Bueno verás, en cuanto a controlar las conexiones sólo por el nombre e incluirlas en una lista, te recomiendo que controles además del por el nombre (RemoteHost) por el puerto (RemotePort). Esto te permitirá que haya varios clientes en una misma máquina. De la otra forma, sólo puede haber un cliente en una máquina. Respecto a tu última pregunta, no creo que puedas poner el servidor en un puerto que ya esté siendo utilizado. Es decir, si tienes un servidor HTTP (puerto 80) no te va a dejar que crees un servidor socket en el puerto 80 sencillamente porque ya está en uso. Con respecto a qué puerto están libres, pues no lo sé. Supongo que todos los que no aparezcan en "netstat -a". Si lo que quieres es utilizar un puerto aletorio y que no esté siendo utilizado por otra conexión, puedes dejar el puerto del servidor a cero (Port = 0) y por ejemplo, en el evento OnListen haces: void __fastcall TForm1::ServerSocket1Listen(TObject *Sender, TCustomWinSocket *Socket) { ShowMessage(Socket->LocalPort); } Y te mostrará el puerto aleatorio que el sistema ha asignado al servidor.
|
|
| Volver arriba |
|
 |
Manolo Invitado
|
Publicado: Vie 21 Jun, 2002 7:38 am Asunto: enviar y recibir mensajes por la red interna |
|
|
| Lo de mi primera pregunta ya lo tengo solucinado, por lo visto cuando se genreal el evento OnDisconnet, aún no se actualiza la variable que indica el numero de conexiones activa, por eso siempre se me mantenía a 1 cuando se habían desconectado todos, poninedo un refreseco de esta variable en un Timer pude comprobar que si se ponía a 0. Lo que me comentas de controlar también el RemotePort para hechar una conexión te diré que lo que quiero hacer es que el servidor envíe al cliente la hora del Pc y los clientes actualicen sus horas correspondientes, por lo que no tiene sentido tener dos clientes en la misma máquina, pero de todas formas lo tendré en cuenta para futuros programas. Muchas gracias por tu ayuda. Saludos Manolo |
|
| Volver arriba |
|
 |
|
|
No puedes publicar temas nuevos en este foro No puedes responder a temas en este foro No puedes editar tus mensajes en este foro No puedes borrar tus mensajes en este foro No puedes votar en las encuestas de este foro
|
© 2002–2026 Club Builder · Funciona con phpBB.
|