 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Samuel Invitado
|
Publicado: Mar 16 Abr, 2002 9:34 pm Asunto: UDP - ayuda pro favor!!! |
|
|
| Estoy con problemas con el NMUDP, y ha tiempo no lo consigo resolver ... Tento enviar datos de la estacion 1 a la estacion 2. A la estacion 1, lo hice uno "for" onde envio uno buffer (char[1500]) por SendBuffer. A la estacion 2, en lo componente NMUDP, hay lo ReadBuffer para receber los datos. LO PROBLEMA ES que solo 5 o 6 datagramas llegam a la estacion 2 !!! Yo ha posto uno sniffer a estacion 1, y los datos san enviados realmente; pero "se pierden" sin llegar a estacion 2... Eso ocorre mismo que sean ambos en la misma ordenadora (enviando para loopback, o 127.0.0.1). Alguien ha visto algo parecido ? Estoy con serios problemas por causa de esto... --------------- La implementacion : si tivera dos componentes TNMUDP, uno TButton y uno TMemo: ------------------------ Global char buffer_r[1500]; // recepcion int lidos; ------------------------ En [Button1] char buffer_e[1500]; // aca va lo preenchimiento, yo tengo // normalmente 50-60 kbytes por vez para //enviar NMUDP1->RemoteHost = 127.0.0.1; NMUDP1->RemotePort = 1000; NMUDP2->LocalPort = 1000; for (int x=0; x = 30; x++) NMUDP1->SendBuffer(buffer_e, 1500, 1500);
------------------------ En [NMUDP2DataReceived] NMUDP2->ReadBuffer(buffer_r, 1500, lidos); Memo1->Lines->Add(buffer_r); Estoy volvendo loco, cualquer ayuda es bienvinda... Gracias!
|
|
| Volver arriba |
|
 |
ikis Master


Registrado: 28 Dic 2002Mensajes: 703Ubicación: Madrid, España
|
Publicado: Sab 18 Oct, 2003 12:01 am Asunto: |
|
|
lo estas probando en forma local o remota?
es decir, si tienes dos pc's conectalas directamente. Eso te va a dar constancia de que el entorno esta bien. |
|
| Volver arriba |
|
 |
_Willa Capt


Registrado: 28 Ago 2002Mensajes: 169Ubicación: Madrid ( España )
|
Publicado: Jue 23 Oct, 2003 1:29 am Asunto: |
|
|
Samuel,
Como conocedor, mi consejo es ....
1) con sistema UDP, crear un protocolo de comunicacion,
donde haya preguntas y respuestas
2) Conexión TCp/IP
Te aconsejo esta ultima opción cuando necesites seguridad en las
comunicaciones. _________________ Saludos
~~~~~~~~
_Willa
~~~~~~~~
www.avancegame.com |
|
| Volver arriba |
|
 |
ikis Master


Registrado: 28 Dic 2002Mensajes: 703Ubicación: Madrid, España
|
Publicado: Jue 23 Oct, 2003 3:34 am Asunto: |
|
|
TCP te da confiabilidad de que los aquetes lleguen ya que establece un sistema de acuses de recibo, pero en una red local con tráfico normal, UDP debería andar perfectamente sin que se pierda ningún paquete.
Este, evidentemente, no el caso de internet |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Vie 24 Oct, 2003 11:46 pm Asunto: |
|
|
Mira, puede que todo este bien, pero creo se te esta pasando algo, casi todo lo que tienes que enviar, es manejado como una Cadena de Caracteres, si estas enviado informacion de este o cual quier otro tipo asegurate de ponerle, al final de la cadena la terminacion NULL, para que no pierdas tus mensajes...
te pongo un codigo que yo utilizo sin ningun problema...
al recibir los datos en un equipo
| Código: |
void __fastcall TDataModule1::NMUDP1DataReceived(TComponent *Sender,
int NumberBytes, AnsiString FromIP, int Port)
{
char Buff[40];
int j;
NMUDP1->ReadBuffer(Buff, 40, j);
Buff[j]=0; // para leer bien los datos
/* // para refrescar datos en red
if(!strcmpi(DivideCadena(Buff,";")->Strings[0].c_str(),"F")){ // F para indicar actualizaion
for (int i = DataModule1->Database1->DataSetCount - 1; i >= 0; i--){
DataModule1->Database1->DataSets[i]->Refresh();
}
}*/
}
|
cuando envias los datos, pues eso no es problema, esta funcion la declaras donde te sirva y ya puedes enviar datos desde cual quier parte
| Código: |
void __fastcall SendMsg(TNMUDP *CeC, // NMUDP para tratar los msgs
AnsiString Cadena, //el mensaje con el nombre del equipo
AnsiString Equipo){ // al tipo de equipo, (E)stacion (S)servidor
if(Equipo.IsEmpty()){
CeC->RemoteHost="192.168.0.1";// servidor que comparte internet
}else{
CeC->RemoteHost=Equipo;// nombre del equipo.
}
CeC->SendBuffer(Cadena.c_str(),Cadena.Length(),Cadena.Length());
}
|
_________________
 |
|
| Volver arriba |
|
 |
Cruiz Ens


Registrado: 29 Oct 2003Mensajes: 30Ubicación: Granada, España.
|
Publicado: Mie 29 Oct, 2003 10:26 am Asunto: Una duada con UDP |
|
|
Hola a todos. soy el ultimo en llegar a la lista.
He creado un programita tipo chat, como el que comentabais.
En una red Local va genial. Peroooo lo he probado via internet y no va.
ni recibe el otro ordenador ni yo.
Yo tengo un Router, he direccionado el puerto 1000 y 1001 a la ip local de mi ordenador. en UDP.
Con eso deberia funcionar. no ? pos se niega.
Otra cosa, si en dicho programa quisiera enviar un archivo, qué seria mejor usar otro componente UDP?
He visto los SendStream aunque no se como se usa.
Bueno muchas gracias, por este estupendo foro. _________________ == No !! al fin de c++ Buider. == |
|
| Volver arriba |
|
 |
ikis Master


Registrado: 28 Dic 2002Mensajes: 703Ubicación: Madrid, España
|
Publicado: Mie 29 Oct, 2003 12:47 pm Asunto: |
|
|
| recuerda que el servidor (la pc a la cual te conectas) debe tener una ip pública. De otro modo no será visible. |
|
| Volver arriba |
|
 |
alfredo Master

Registrado: 13 Oct 2003Mensajes: 246Ubicación: Valencia Venezuela
|
Publicado: Sab 01 Nov, 2003 7:28 pm Asunto: Envio de datos |
|
|
No soy un experto en esto, pero UDP significa exactamente User Defined Protocol, por lo cual el componente NMUDP solo provee un medio para la conexion y no verifica el correcto envio y recepcion de los paquetes como si lo hace TCP/IP.
Para que lo veas de otra manera, con este componente la pc que envia simplemente pone el paquete en la red y se desentiende de el a menos que tu codigo prevea esta situacion.
Necesitas desarrollar al menos un protocolo minimo de comunicacion para tener algun grado de fiabilidad, algo asi como:
Pc1: "Pc2 estas ahi?"
Pc1: "Pc2 estas ahi?"
Pc2: "Aqui Pc2 Atenta"
Pc1: "Te Envio 10 paquetes"
Pc2: "Lista para recibir"
Pc1: "Paquete 1/10"
Pc2: "Recibido 1/10"
Pc1: "Paquete 2/10"
.........
Pc2: "No Entendi Repite 2/10"
Pc1: "Paquete 2/10"
Pc2: "Recibido 2/10"
Etc...
Para esto debes aprovechar los eventos del componente OnDataReceived, OnDataSend, OnBufferInvalid, OnStreamInvalid
Recuerda que en la pc que envia puedes tener un bucle mandando paquetes a una velocidad mayor de lo que la otra los puede recibir, es decir que las pcs no trabajan de manera sincronizada sino asincrona.
Respecto a la conexion con "vista a fuera" es decir internet, necesitas desarrollar ademas de el/los programa(s) de enviar y recibir otro con el proposito de servir de puente en la barrera entre Internet e Intranet, este programa seria un servidor corriendo en las maquinas que tengan "vista" a la red de redes, un ejemplo similar son los programas para compartir el acceso a internet, puedes tener una red local con una pc que disponga de internet, pero si no esta corriendo un programa de compartir no hay manera, solo navegaras desde esa maquina.
De todas formas aclaro que asi es como me parece a mi, si estoy equivocado en algo por favor me corrijanme, pues asi vamos todos aprendiendo  |
|
| Volver arriba |
|
 |
Cruiz Ens


Registrado: 29 Oct 2003Mensajes: 30Ubicación: Granada, España.
|
Publicado: Sab 01 Nov, 2003 8:51 pm Asunto: Chat |
|
|
Muchas gracias.
Es muy ilustrativo tu texto, he aprendido bastante. Como no tenia claro como hacerlo, he visto el ejemplo de c++ Builder que hay sobre Chat y me ha gustado mucho.
Es con Socket de cliente y servidor. Lo he visto muy seguro. Y voy a probara crear uno parecido.
Al menos para aprender.
Quiero crear un chat así para mi trabajo, y poder enviarle un fichero a la otra persona. Y sobre todo, poder tener a varias personas conectadas.
Y lo más importane, que el chat atienda a sentencias SQL mirando a la base de datos de mi programa.
Que te parece ? es muy ambicioso ?
Un saludo. _________________ == No !! al fin de c++ Buider. == |
|
| 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.
|