Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





P2p

Iniciado por KaMuY, 15 de Febrero de 2006, 02:04:47 PM

« anterior - próximo »

KaMuY

 Quiero implementar un chat simple P2P, ¿alguien me dice por donde podria empezar?
¿Librerias, consejos, documentación, teorias, tutoriales?

Warchief

Cita de: "KaMuY"Quiero implementar un chat simple P2P, ¿alguien me dice por donde podria empezar?
¿Librerias, consejos, documentación, teorias, tutoriales?
¿Para que SO? ¿Qué lenguaje?

En cualquier caso, con sockets a pelo.
Unix, por ejemplo: http://www.ecst.csuchico.edu/~beej/guide/i.../ipc/usock.html
Windows, por ejemplo: http://burks.bton.ac.uk/burks/pcinfo/progd...ock/winsock.htm

Un chat es bastante sencillo.

KaMuY

 es para win32 aunque si la libreria es multiplataforma mejor :P

¿Sockets a pelo?

Se un chat es bastante simple pero la idea es aprender conceptos y tal... para saber programar estructuras P2P y como trabajarlas.

Me gustaria algo mas del razonamiento que te hace decidirte por una elecion o otra :P

Muchas gracias por tu respuesta :)


Warchief

 Lo sockets son dependientes del sistema operativo. Son unas pocas llamadas que permiten por ejemplo: escuchar por un puerto (para que te conecten), abrir conexión hacia un puerto de otro ordena, enviar datos, etc.
Para win32 Winsock
Con sockets a pelo me refiero a que son de bajo nivel, la estructura te la tienes que montar tú.

También puedes probar con algo como: (yo no lo he tocado)
http://www.alhem.net/Sockets/index_spanish.html , que tiene ejemplos de chats:
http://www.alhem.net/project/example3/index.html
http://www.alhem.net/project/example7/index.html

Sobre la arquitectura P2P en vez de Cliente/Servidor, tendrás que pensar cómo hacerlo (por ejemplo un servidor apunta direcciones de usuarios, un servidor apunta direcciones de otros servidores, cada cliente se guarda su contactos e intenta lanzarse con ellos al chat (por ip),...).

Puedes fijarte en sitios como:
http://java.sun.com/developer/technicalArt...orking/jxta2.0/
Diagrama del chat P2P
Si conoces java JXTA: http://www.jxta.org/


Son sólo indicaciones, nunca he hecho ningún chat p2p :)

KaMuY

 Hola Warchief, la idea es esta que tu comentas. el problema es que no consigo hacer funcionar la libreria JXTA, además he visto que existe una implementación de la libreria en C.

Has echo algo con JXTA, sabes como puedo iniciarme?

Una de mis dudas es saber si sale a cuenta aprender como va JXTA o hacer la estructura de Red a pelo con sockets... :P


__________________________________________________________
Puedes fijarte en sitios como:
http://java.sun.com/developer/technicalArt...orking/jxta2.0/
Diagrama del chat P2P
Si conoces java JXTA: http://www.jxta.org/
__________________________________________________________

Warchief

 Hombre, si lo que dominas es java yo me iría a jxta, porque parece una abastracción de los sockets (recuerda que los sockets no son más que un puñado de funciones como las de ficheros (open/close/read/write y algunas más de control select/bind/etc). En jxta no he hecho nada; lo único parecido que he hecho en java ha sido con JMF (Java Media Framework, que está bien si quieres añadir voz al chat XD).

De la implementación a C ni idea, he visto el port a C#, pero nada más.

También puedes echar un vistazo a otras libs como RakNet o Hawk NL (no, no he probado ninguna).

Si el objetivo es aprender y lo que conoces es C:
Como un chat no es demasiado complicado, como primera aplicación se puede hacer con sockets. Una vez que estés conforme con la programación de red, se puede pensar en un objetivo mayor o incluso volver a hacer el chat usando una de las librerías.

Si vuelves a considerar sockets:
Guía estupenda (pero de Unix): http://www.arrakis.es/~dmrq/beej/index.html
Artículos Winsock en Gamedev: http://www.gamedev.net/reference/list.asp?...tegoryid=30#298

Si conoces java, JXTA. Si conoces C, sockets. Si quieres aprender librería concreta, la librería.

¿Por qué no puedes hacer correr JXTA?

KaMuY

 A ver, domino C, java etc etc.. soy Eng. informatico Superior.

Esta noche intentare probar con JXTA algo.. el problema es que me petaba las librerias.

ya dire algo

Warchief

Cita de: "KaMuY"Esta noche intentare probar con JXTA algo.. el problema es que me petaba las librerias.
:huh: Cuenta pues qué error da, etc, a ver si lo sacamos.

KaMuY

 Creo que lo are todo con sockets a pelo :P

Ahora me surge una duda, como hacen programas ¿como el kazaa para que no sea necesario abrir puertos y los peers se comuniquen?

Tenia entendido que normalmente en una P2P cada peer era servidor y cliente a la vez, por lo tanto en algún momento tendría que estar escuchando una conexión entrante, ¿no?

O trabajan con UDP... o ¿como lo hacen?

¿Alguien lo sabe?

Fanakito

 Usan UDP, más que nada porque es algo más eficiente y como se verifican los chunks y se pueden pedir trozos concretos. Para atravesar NAT lo más normal es usar STUN (aqui hay un algoritmo algo más simple). Esto se salta un NAT sin muchos problemas, ahora... firewalls y proxys hay que hacer cosas mas sofisticadas.

KaMuY

 a ver si lo entendí bien:

La idea es que  cada peer comience una conexión UDP por un puerto determinado. Entonces cada peer tendrá abierto un puerto por el que podrá recibir paquetes UDP. Entonces solo queda intercambiar paquetes entre los peers a los puertos que hemos abierto en cada maquina al iniciar una conexión..

¿Es esto? :S

Zaelsius

 Otra alternativa(bueno, al menos una manera de "abrir los puertos" del usuario) es UPnP (Wikipedia.org), que también tiene sus propios problemas. El cliente de bittorrent Azureus lo implementa, aunque depende del router si viene activado por defecto o no.

Fanakito

Cita de: "KaMuY"La idea es que  cada peer comience una conexión UDP por un puerto determinado.
La idea es que conectas con un servidor, que intercambia los puertos que el router ha asignado a la conexion, y utilizas estos puertos abiertos para conectar con el otro. Con routers hardware suele funcionar... aunque si tu programa tiene mucho exito el servidor puede soportar bastantes conexiones.

Warchief

 accept te da un nuevo puerto automáticamente.

Me explico:
1) Servidor: Se hace bind del puerto X, esto pone el puerto X a escuchar
2) Cliente: Se hace opensocket que te da un puerto libre Z (no importa cuál)
3) Cliente: Hace connect al puerto X del Servidor (debe conocer su ip y puerto)
4) Servidor: accept escucha la petición del cliente y crea un puerto nuevo Y (libre, no importa cuál)
5) Los sockets Z e Y quedan emparejados. Lo que el cliente envía por Z lo recibe el servidor por Y
(X sigue escuchando)

Por tanto sí, tienes que poner a escuchar un puerto X.

La obtención de la ip y puerto del servidor es otra historia. En GNUtella se hace con caché. En Emule/Edonkey con los servidores ed2k, el nodes.dat (o algo así) de contactos para Kademlia y la transmisión de nuevas fuentes al conectar a otro.

En emule hay opciones para desactivar UDP, que es lo que usa Kademlia. Creo que ed2k usa TCP.

elfer

por casualidad he llegado a este foro que por lo que veo hay mucho nivel...jeje, yo soy totalmente aficionado y por motivos personales he realizado una pagina web, www.renegimenez.com y la verdad que no tengo ni idea de programacion ni de na de eso, pero me seria interesante poner dos salas de chat, una para los amigos y otra para hablar de deporte, he realizado varias pruebas y no me termina de convencer, y no sé, se me ha ocurrido "pedir ayuda" por aqui a ver si alguien me podia configurar uno para meterlo en la pagina o asesorarme de donde puedo cogerlo para que funcione siempre bien...muchas gracias y espero alguna respuesta






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.