Hack x Crack - Comunidad de Seguridad informática

Programación => C / C++ => Mensaje iniciado por: URSS_Lover en Octubre 06, 2017, 04:28:05 am

Título: [Consulta] Sockets, arquitecturas de red y source code, en C++.
Publicado por: URSS_Lover en Octubre 06, 2017, 04:28:05 am
Buenas a todos, colegas.
He estado estudiando el tema de los sockets en C++ porque quiero crear una pequeña aplicación usando la arquitectura (no se realmente si es a toda regla una arquitectura de red) Peer-to-peer. Ahora, me han surgido una serie de dudas, he buscado en diversas fuentes de información y he logrado asimilar cierto contenido. He encontrado que C++ no tiene de forma nativa recursos para manejar los sockets, todo su uso se realiza usando el API del SO como intermediario, pero de acá me ha surgido una idea que es mas un sketch rápido que algo serio (estoy estudiando para analizar las posiblidades).
En primer lugar, ¿Se pueden hacer un programa que use sockets y adaptarlo a multiples plataformas? Una idea rápida que se me ocurre para solucionar el problema es a través de los macros del prepocesador, si Windows está definido entonces usa todos los métodos con los que operan los winsocks, si no está definido Windows pero Linux está definido, entonces que use los recursos que proporciona Linux para manejar conexiones y tal. ¿En escencia los dos son lo mismo? ¿No habría problema si una estancia de ese software que está corriendo en Windows quiere comunicarse con una estancia de software corriendo en Linux?
Eso en primer lugar, y en segundo lugar, pues eso, ¿El tema del P2P está relacionado meramente como arquitectura de red? Porque he visto que casi toda la documentación está para hacer un modelo donde los nodos sean cliente o servidor, pero no he encontrado documentación sobre como funcionan los nodos que pueden cumplir ambas funciones.
Sobre otro tema, estaba estudiando y según vi, los protocolos UDP y TCP, en la practica, son dos maneras distinta de operar con los sockets, o mejor dicho, son dos modelos de sockets distintos, cada uno con su forma de operar con la comunicación y los datos, pero ¿Para la arquitectura P2p es irrelevante cual modelo de socket se implemente?
Y finalmente (pero no menos importante) ¿Cómo ustedes hacen (implicando que lo hagan) para leer código fuente demasiado modularizado? Parte de lo que he aprendido lo he sacado directamente leyendo código fuente, pero aún así, a veces se vuelve un coñazo cuando tienes que leer miles y miles de carpetas (en mi caso, intentando leer el source del core de bitcoin) y finalmente acabo desistiendo de la tarea, ¿Alguna recomendación o solo hay que ponerse en un estado mental de concentración absoluta y alcanzar el nirvana binario (sarcasmo con una pizca de ironía, para darle sazón al post)?

De verdad mis disculpas por tanta preguntadera, es que he estado leyendo y esas son preguntas que llevo rato sin poder responder, y pues uso el foro como ultimo medio (o como penultimo, igual está ser constante y leer que jode), de todas formas, les agradezco las respuestas. <3 Los quiero mucho muchachos.

TL;DR:
- ¿Se pueden hacer un programa que use sockets y adaptarlo a multiples plataformas usando los macros del preprocesador de C++?
- ¿No habría problema si una estancia de ese software que está corriendo en Windows quiere comunicarse con una estancia de software corriendo en Linux?
- ¿El tema del P2P está relacionado meramente como arquitectura de red?
- ¿Para la arquitectura P2P es irrelevante cual modelo de socket se implemente?
- ¿Cómo ustedes hacen (implicando que lo hagan) para leer código fuente demasiado modularizado?

Les deseo una feliz noche y un buen café para el que guste. ¡Paz! <3
Título: Re:[Consulta] Sockets, arquitecturas de red y source code, en C++.
Publicado por: ravenheart en Octubre 07, 2017, 02:19:14 pm
¿En escencia los dos son lo mismo?
En esencia, sí.

Citar
¿No habría problema si una estancia de ese software que está corriendo en Windows quiere comunicarse con una estancia de software corriendo en Linux?
Si sigues el estándar, no. En algún caso, al cerrar mal una conexión era diferente (en uno se cerraba y en otro no, no recuerdo los detalles). Si la arquitectura de máquina es diferente (Little endian/Big endian) puedes encontrar problemas al enviar datos binarios. Pero es no es culpa de los sockets.

Citar
¿El tema del P2P está relacionado meramente como arquitectura de red?
No entiendo la pregunta, el P2P no tiene ninguna relación con la arquitectura de red. Simplemente es un modo de programar aplicaciones de red en que todos los usuarios son iguales (hay matices, en la red eDonkey por ejemplo hay servidores, que son usuarios "especiales". Creo recordar que no son necesarios para que la red funcione, pero sí para que alcance un buen rendimiento y ciertas funcionalidades, como la búsqueda de archivos).


Citar
Porque he visto que casi toda la documentación está para hacer un modelo donde los nodos sean cliente o servidor, pero no he encontrado documentación sobre como funcionan los nodos que pueden cumplir ambas funciones.
Pues por un lado implementan la función de servidor, escuchando conexiones externas, y por otro se conectan a otros servidores. En realidad no tiene ningún misterio.

Citar
¿Para la arquitectura P2P es irrelevante cual modelo de socket se implemente?
Básicamente sí. La diferencia fundamental es que en TCP te vienen todos los datos ordenados, y si alguno se pierde el que envía se entera, y en UDP tienes que hacer toda esa gestión tú mismo, si es que la necesitas. Para transferencia de ficheros por ejemplo puede ser más práctico UDP:
El cliente dice: "envíame desde el byte X hasta el byte Y del fichero Z". Y el servidor lo empieza a enviar. Tendría que etiquetar en cada paquete qué bytes van incluidos, porque no hay garantías de orden. Si parte no llega, se vuelve a pedir y solucionado.
Para gestionar una conexión integral con estado, mucho más fácil con TCP.

Citar
¿Cómo ustedes hacen (implicando que lo hagan) para leer código fuente demasiado modularizado?
Con un buen IDE con depurador integrado. Vg. Visual Studio.

Citar
TL;DR:
- ¿Se pueden hacer un programa que use sockets y adaptarlo a multiples plataformas usando los macros del preprocesador de C++?
Sí, y es el único motivo para usar macros en C++. (Técnicamente yo no considero que las definiones del preprocesador sean macros, pero bueno).
La forma elegante de hacer esto es crearte una clase (o funciones sueltas, da igual) por encima de los sockets que controle las diferencias entre SSOO, y en el resto del código solo usar esa clase, nunca interactuar directamente con los sockets. De ese modo, los puedes cambiar de forma transparente. E incluso en el futuro podrías soportar un nuevo protocolo de comunicaciones con solo implementar la traducción entre tu clase y el nuevo protocolo. Parao esto existen los interfaces (clases abstractas en C++).
Título: Re:[Consulta] Sockets, arquitecturas de red y source code, en C++.
Publicado por: URSS_Lover en Octubre 10, 2017, 01:57:29 pm
Muchas gracias hermano, ya he entendido practicamente todo lo que necesito para arrancar, salvo por una cosilla:

TL;DR:
- ¿Se pueden hacer un programa que use sockets y adaptarlo a multiples plataformas usando los macros del preprocesador de C++?
Sí, y es el único motivo para usar macros en C++. (Técnicamente yo no considero que las definiones del preprocesador sean macros, pero bueno).
La forma elegante de hacer esto es crearte una clase (o funciones sueltas, da igual) por encima de los sockets que controle las diferencias entre SSOO, y en el resto del código solo usar esa clase, nunca interactuar directamente con los sockets. De ese modo, los puedes cambiar de forma transparente. E incluso en el futuro podrías soportar un nuevo protocolo de comunicaciones con solo implementar la traducción entre tu clase y el nuevo protocolo. Parao esto existen los interfaces (clases abstractas en C++).

Dices que es mas optimo crear clases o funciones para controlar las diferencias entre los sistemas operativos, pero eso solo lo veo posible a través de definiciones del preprocesador, y adaptando lo que entendí de tu idea con la mía quedaría como ejemplo una función tipo:

Código: C++
  1. tipo funcionMultiplataforma() {
  2. #ifdef _WINDOWS
  3. // Aca va el código correspondiente a Windows.
  4. #else if defined linux / mac / etc
  5. // Y acá cualquier otra cosa, por poner un ejemplo practico, Linux.
  6. #endif
  7. }

¿O te refieres a otra cosa?
Título: Re:[Consulta] Sockets, arquitecturas de red y source code, en C++.
Publicado por: ravenheart en Octubre 10, 2017, 08:07:51 pm
Esa es la forma más habitual, sí. Para programación de sockets mira la guía de Beej si no lo has hecho ya, por cierto.

Lo importante es tener esa funcionalidad aislada en uno (o unos pocos) ficheros, y no tener ifdefs desparramados por todo el código.
Título: Re:[Consulta] Sockets, arquitecturas de red y source code, en C++.
Publicado por: URSS_Lover en Octubre 11, 2017, 04:50:53 am
Gracias por la ayuda bro, me ha servido de mucho, no conocia la guia de Beej, pero es un exelente recurso, ya lo estoy consumiendo. ¡Un abrazo!