2011-08-18 60 views
5

Me doy cuenta de que esta pregunta es similar tosomeothers, pero calculé que mi situación es lo suficientemente diferente como para justificar su propia pregunta (con suerte).Establezca una conexión P2P en C#

Lo que estoy planeando es implementar un programa en la computadora de otra persona que abrirá una conexión a mi computadora después de lo cual, supongo, las computadoras deberían poder comunicarse entre sí. Una vez que se inicia el programa, debería ser capaz de extraer la información de la dirección y el puerto (si no están bloqueados) para crear una conexión, ¿no?

Lo que es más, es la configuración de Internet del dormitorio en el que vivo. Cada habitación tiene asignado un puerto único y una dirección IP estática asignada por un servidor DHCP. ¿Cómo factoro esto en el diseño de mi programa?

Estoy pensando que esta configuración no requiere un servidor como punto de acceso intermedio, ya que los detalles de mi dirección siempre serán los mismos y la computadora host simplemente puede conectarse a mi computadora sin más información. ¿Es esto correcto?

Finalmente, estoy leyendo algunas páginas sobre cómo crear una conexión, pero estoy confundido con todas las posibilidades de TcpConnection, WCF, CORBA, etc. ¿Cuál de las dos sería la más simple para empezar suponiendo que solo quiero para enviar mensajes a la otra máquina?

Actualización:

La dirección es estática en el sentido de que no cambia. Mi dirección IP tiene el formato 130.83.20.xxx y puedo esperar a que el servidor DHCP me asigne esta dirección, o puedo ingresarla manualmente usando una configuración de IP estática.

En cuanto a los mensajes en sí, los mensajes de texto simples serán suficientes para el inicio. Los puertos mencionados anteriormente son los puertos del conmutador y no entran en juego durante la programación de la red, creo.

+0

Para guiarlo, necesitaremos saber más acerca de su objetivo. Dependiendo de la naturaleza de los datos que necesita enviar, TcpConnection podría ser bueno, pero quizás un mejor servicio de WCF sería mejor. No entiendo a qué te refieres cuando dices que a cada habitación se le asigna un puerto y una IP estática ... ¿Te refieres a un puerto físico? De ser así, eso no entra en juego durante la programación de la red. Los puertos TCP/UDP sin embargo, son importantes. Necesitará qué puertos están disponibles para su uso. – Nate

+0

@Nate: Gracias por el aviso. Por ahora, solo quiero probar este programa en la computadora de un amigo y creo mensajes de texto simples como, "Hola, ¿cómo estás?" debería estar bien. Bueno, por ejemplo, mi dirección IP es 130.83.20.103 o algo así. No cambia El servidor DHCP me asigna esta dirección o puedo ingresarla manualmente. Cada habitación tiene un puerto que puede ser bloqueado por la administración central de TI. Estos son los puertos del conmutador, creo. – IAE

+0

Si el servidor DHCP puede asignarle una dirección IP de '130.83.20.103', entonces no debería configurarse manualmente para tener esa dirección IP. Si lo hizo y el servidor DHCP le asigna esa dirección a otra persona, terminaría con un conflicto de direcciones IP y efectivamente un ataque de denegación de servicio contra el pobre imbécil al que el servidor DHCP le dio esa dirección IP. – Justin

Respuesta

5

Me gustaría ir con TcpClient y TcpListener. Vea el código de ejemplo en MSDN, cópielo y péguelo en dos proyectos de consola C# y compárelos.

Utilizaría 127.0.0.1 (localhost) para fines de prueba en el puerto 5001 (un puerto de prueba de uso general).

TcpListener server = new TcpListener(IPAddress.Parse("127.0.0.1"), 5001); 

Entonces debería poder probar un cliente/servidor simple que se ejecute solo en su computadora. Una vez que lo hagas funcionar, puedes llevar al cliente a otra computadora en tu dormitorio y asegurarte de que siga funcionando. Una vez que eso funcione, puede ir a una cafetería local y llevar al cliente consigo. Deje el servidor funcionando en una dirección IP conocida en su dormitorio. En este caso, haga que el servidor se vincule a su IP externa real (no localhost). Usted puede hacer esto simplemente especificando un puerto al constructor TcpListener: `

TcpListener server = new TcpListener(5001); 

Una vez que todo lo que trabajo en solitario o con un amigo, a continuación, enviarlo externa. Es mejor que estas cosas funcionen en una demostración antes de enviársela a su cliente para que solucione el problema. :)

razonamiento detrás de mi respuesta:

simple TCP cliente/servidor es muy sencillo y permitirá un programa de chat simple entre dos ordenadores. Luego puede reforzarlo para enviar cualquier transmisión de datos que desee.Puede agregar un código como este para obtener acceso a un StreamWriter:

NetworkStream stream = client.GetStream(); 
StreamWriter writer = new StreamWriter(stream); 
+1

¿Hay algún límite para transferir archivos grandes? – whihathac

+0

No realmente. Simplemente implementa los métodos de Carga/Descarga en sus clases de servidor y cliente y en esos métodos transmitirá bloques de datos a un archivo. Entonces no envía todos los datos a la vez. Simplemente envíe 1K a la vez más o menos. Puede ingresar en el diseño del protocolo en este punto si desea implementar reconocimientos, validación de integridad de datos, etc. Pero en un nivel básico, solo lee desde una secuencia de red y escribe en una secuencia de archivos, y viceversa en el otro lado . Sin límite (salvo el límite de la secuencia de archivos, como el límite de tamaño de archivo de 4 GB del sistema de archivos FAT32). – mattypiper

Cuestiones relacionadas