2010-11-28 10 views
14

Escribo un servidor/sistema cliente en C, que usa Sockets BSD bajo una conexión TCP. El servidor tiene múltiples subprocesos, con cada conexión ejecutándose en su propio receptor. Cada cliente hace un buen trabajo hablando individualmente con el servidor, lamentablemente no puedo pensar en una forma de implementar una función SendToAll(), por ejemplo, si el cliente A hace algo que requiere enviar un paquete a todos los clientes ¿Cómo haría esto?¿Es posible la transmisión a través de TCP?

Estaba considerando implementar una cola en cada receptor, y cualquier transmisión se envía a esas colas; cuando el receptor envía un nuevo paquete, agrega ese mensaje al paquete también, si eso tiene sentido.

Pero sí, ¿hay alguna manera de transmitir a través de TCP, como se puede a través de UDP?

+1

... ¿Cómo recibiría los paquetes de ACK? –

Respuesta

7

No, no lo hay. Por ejemplo, el concepto de tamaño de ventana y cómo se ajusta se vuelve completamente sin sentido si estás tratando de hablar con varias partes.

Podría ser posible crear un nuevo protocolo que compartiera muchos de los atributos de TCP al tiempo que permite la multidifusión. Pero creo que sería muy problemático. Por ejemplo, la velocidad a la que los destinatarios reciben datos se vería limitada por las limitaciones del receptor más lento. El remitente tiene que administrar el espacio del búfer para que incluso el receptor más lento pueda obtener retransmisiones si es necesario.

No, creo que los protocolos para hacer multidifusión siempre tendrán que ser muy especiales y se centrarán en el problema exacto. Algo generalizado y similar al TCP simplemente no es factible.

Hay formas de hacer una transferencia de datos a granel de multidifusión confiable. La idea básica es usar erasure codes para transmitir continuamente información en una especie de bucle. Luego, un destinatario puede comenzar a recibir paquetes hasta que tengan suficiente para reconstruir el archivo original.

Pero estos no parecen encajar bien en su escenario.

+2

[Protocolos de multidifusión confiables existentes o propuestos] (http://en.wikipedia.org/wiki/Reliable_multicast#Existing_or_proposed_protocols) – dreamlax

+1

@dreamlax - Interesante. Sé sobre las ideas para la transferencia de datos a granel de multidifusión confiable. Esto implica usar códigos de borrado y simplemente retransmitir en un bucle. De esta forma, un destinatario puede comenzar a recoger cosas en el medio y continuar recibiendo hasta que tenga suficientes datos para reconstruir todo el archivo. – Omnifarious

0

Su SendToAll() tendrá que recorrer todas las tomas abiertas y escribir los datos en cada uno de forma independiente.

La difusión y multidifusión están limitadas a sockets UDP solamente.

+3

Eso no es del todo cierto, existen otros protocolos que permiten la multidifusión y la radiodifusión, por ejemplo, existe [PGM] (http://en.wikipedia.org/wiki/Pragmatic_General_Multicast). – dreamlax

10

Como todos han dicho que no es posible con TCP, solo es de unidifusión. Sin embargo, hay implementaciones de multidifusión confiable, que deberían darle multicast con la confiabilidad de TCP. Ver wikipedia, especialmente Pragmatic General Multicast.

2

Considere mirar overlay networks, o simplemente usando un middleware de mensajería que proporciona semántica de publicación como ØMQ que también proporciona convenientemente una API de socket BSD.

Cuestiones relacionadas