PDA

Ver la Versión Completa : Problema con sockets!!!


DarkByte
09-11-2003, 09:20:14
Hola de nuevo. Tengo un problema:

Estoy haciendo un programa que funcione como un chat para una red. Funciona de modo que un cliente envía la información y el servidor se la devuelve a todo el mundo (o así es como debería funcionar:confused: ), pero no, el servidor solo me devuelve la información al cliente que se la mandó. El código en el que creo que debe de estar el error es el siguiente:

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
TextoRecibido : String;
begin
TextoRecibido := Socket.ReceiveText;
Socket.SendText(TextoRecibido);
txtRecibido.Lines.Add (TextoRecibido);
end;

Aclaración: txtRecibido es un Memo.


Gracias a todos de nuevo, espero su ayuda

Descendents
09-11-2003, 13:53:32
Claro, porque tu se lo estas enviando a una IP en concreto.El socket que envia, tiene que apuntar a todas las IPS.

Primero a una y envia, luego a otra y envia y asi.

Bueno realmente lo correcto, seria, utulizar la misma conexion que el cliente te abrio hacia el servidor.

Ejemplo:
SERVIDOR
PC1
PC2
PC3

Paso 1
PC1 abre conexion hacia el servidor.
PC2 abre conexion hacia el servidor.
PC3 abre conexion hacia el servidor.
(es decir se conenectan a la IP del SERVIDOR)

Paso2
PC1 envia mensaje al SERVIDOR.

Paso3
SERVIDOR, envia a traves de la conexion anteriormente abierta por cada uno de los PCS(excepto PC1,claro) hacia el,el mensaje enviado Por PC1

Espero te haya quedado claro.
Un saludo

DarkByte
09-11-2003, 17:35:12
Descendents, esos son los pasos que estaba intentando segir, excepto por lo de enviarselos a todo excepto PC1, es decir, el pc1 enviaría la información y la recibiría del SERVIDOR, así sé si ha llegado al servidor la información.


Mi problema está en la parte de consegir que envíe la información a todos, no solo al que se la ha enviado.

De todos modos, muchas gracias, eres el único que ha mostrado interés por mi hilo, de momento. Gracias

Descendents
10-11-2003, 00:46:13
Dark byte.
El problema que me dices, es lo que te dije antes.

La solución esta en que tienes que utilizar la conexión que cada pc le abrio al servidor, para enviarle lo que te de la gana desde el servidor a cualquier pc.

Es decir, el servidor no tiene que abrir ninguna conexión.Tan solo tiene que utilizar las conexiones abiertas por cada pc hacia él, para devolverles una respuesta o lo que quieras.

Espero que me entiendas

Suerte

jachguate
10-11-2003, 01:02:51
Has visto el código del chat que viene en las demos de las Indy. Creo que te aclarará mucho y te dará ideas para hacer lo que queres.

Hasta luego.

;)

madman
10-11-2003, 01:04:09
Seria mas facil que vieras el ejemplo de Chat de las Indy.

Es un chat funcional. Puedes darle una miradita y checar que es lo que no estas haciendo para que te funcione con los sockets o en fin usar este ejemplo para crear el tuyo.

Saludos!

madman
10-11-2003, 01:05:59
Oh! :eek:

Por dos minutos! jejeje

jachguate
10-11-2003, 01:08:44
Me dicen el más rápido del oeste... jejejeje. :D :D :cool:

__hector
10-11-2003, 07:53:15
Si no estas usando Indy, sino los componentes genericos de manejo de sockets de delphi, tienes que hacer un recorrido por todos los clientes conectados al servidor, y repartirle los mensajes a cada uno.

Sucede que cada vez que conectas, el serversocket mantiene una coleccion de las distintas conexiones que tiene establecidas a el, asi que en vez de escribir el codigo:


procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
TextoRecibido : String;
begin
TextoRecibido := Socket.ReceiveText;
Socket.SendText(TextoRecibido);
txtRecibido.Lines.Add (TextoRecibido);
end;


escribirias:


procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
TextoRecibido : String;
m : integer;
begin
TextoRecibido := ServerSocket.ReceiveText;
for m := 0 to ServerSocket.Socket.ActiveConnections do
ServerSocket.Socket.Connections[m].SendText(TextoRecibido);

txtRecibido.Lines.Add (TextoRecibido);
end;

DarkByte
11-11-2003, 19:37:50
Gracias!!, probaré esto último y ahora os cuento. Y por cierto..., no uso las Indy.

"Muxas ashias";)

DarkByte
14-11-2003, 19:21:24
No me funciona!!, me da error nada mas recibir el serversocket el texto!! :'(.

Estoy trabajando en un ordenador sin internet... no se si eso influirá algo..

__hector
14-11-2003, 20:04:05
Cual es el error que da?

Fe de errata, en vez de ser ActiveConnections es ActiveConnections - 1

DarkByte
14-11-2003, 20:50:19
Ah, vale, lo probaré, de todos modos, si me pudiese comentar el codigo... mejor, así aprendería mas, que es lo que me interesa fundamentalmete, gracias

DarkByte
18-11-2003, 19:42:17
Me sigue dando fallos...,:( me dice:
Project Messenger.exe raised exception class ESocketError with message "Windows socket error: No se ha permitido una peticíón para enviar o recibir datos ya que el socket no está conectado y no se ha proporcionado ninguna direción, al realizar el envío en un socket datagramas por medio de una llamada sendto (10057), on API 'recv". Procces stopped, Use Step or Run to continue...

¿Tendrá algo que ver que no tenga ese ordenador conectado a internet?.

Gracias por adelantado... y si alguien me pudiese, además de responderme, explicarme cómo funciona el código..., se lo agradecería de verdad.

madman
20-11-2003, 19:04:08
Comentas que es para una RED. Pero...
¿Tu aplicacion servidor/cliente necesita el internet para poder conectarse?

__hector
21-11-2003, 03:28:10
Puedes, dentro del for, verificar si el cliente esta conectado al servidor.

Aunque esta supuesto a encontrar cada conexion en el arreglo, tomando en cuenta la propiedad ActiveConnections, no se si cuando uno de los clientes se desconecta el reorganiza el indice de clientes conectados.

DarkByte
21-11-2003, 09:56:40
Madman, no se. Lo digo porque en la red se que se pueden abrir puertos y enviar información..., sin embargo no se si en un pc sin internet y sin conexión a red funciona mi programa igual que en el de la red.

Las pruebas las hago en el ordenador sin red e internet, ya que el modem usb de telefónica no me funciona en este.

jachguate
21-11-2003, 18:21:29
Cualquier programa de red debe funcionar, incluso si tu máquina no esta en ninguna red, siempre y cuando se hayan instalado al menos un controlador de red y los protocolos que querras utilizar.

Eso si, si tu programa se conectará a un servidor que no está accesible, pues no funcionará.

Internet, desde el punto de vista de redes, simplemente es una serie de nodos mas.

Hasta luego.

;)

madman
21-11-2003, 20:52:07
Si tienes tu aplicacion en una computadora sin red, creo que puedes conectarte a tu misma computadora. :D

Yo asi hice una aplicacion pequeña (server and workstation) que desde el cliente manda al servidor todo lo que se escribe al servidor (ya se los sermones de etica y privacidad :rolleyes: ) pero para poder saber si funcionaba nada mas utilizaba la IP de mi makina en si misma.

Si tienes un adaptador de red yo creo que colocandole una IP X puede funcionar, asi como te digo.

Tal vez... :p

guillotmarc
05-12-2003, 21:09:44
Prueba en la línea de comandos :

ping localhost

Si te indica que hay respuesta, entonces el equipo tiene bien configurado el protocolo TCP/IP.

En caso negativo, tienes que instalar en la maquina un adaptador de red (puedes simularlo instalando el adaptador Microsoft loopback adapter, en Windows XP veo que se llama Adaptador de bucle invertido de Microsoft). Una vez instalado el adaptador (tarjeta de red), tienes que instalar y configurar el protocolo TCP/IP.

Respecto a programar la aplicación, aunque nunca he programado nada de este tipo, es muy probable que tengas que ejecutar a la vez el cliente y el servidor, puesto que sino, si pruebas el cliente no podrá conectarse a ninguna parte.

NOTA: Ejecuta la parte servidor en la misma maquina, y en la parte cliente especifica localhost como dirección a la que te quieres conectar.

Saludos.

DarkByte
08-12-2003, 13:02:49
Bien, mi protocolo Ip está bien, y lo de que tengo que correr el ejecutable y el servidor ya lo sabía y lo estaba haciendo. Pero sigue dándome el mismo error al enviar el mensaje :(.

madman
09-12-2003, 03:41:31
Por cierto
¿Porque no has intentado usar los componentes IdTCPClient/IdTCPServer?
¿Especificamente tienes que usar los socket's?

DarkByte
16-12-2003, 19:54:32
No obligatoriamente, pero solo me se defender más o menos con los client y server sockets.

Siento haberme ausentado tanto en responder, estos días estoy muy ocupado. ¡¡Aunque ya es navidad!!