2012-03-16 17 views
8

Según tengo entendido, es posible crear una red nonblockingsocket en PHP 5.x.Enchufes no bloqueantes: ¿están en cola los mensajes?

Pero, ¿qué ocurre si un script envía varios mensajes largos usando el mismo socket sin bloqueo de la siguiente manera:

socket_write($socket, $string1, $length); 
socket_write($socket, $string2, $length); 
socket_write($socket, $string3, $length); 
socket_write($socket, $string4, $length); 

Son estos mensajes en cola (? En el lado emisor/receptor) o es posible que el receptor recibe partes de mensajes diferentes porque enviaron "paralelo"?

Por ejemplo: ¿Es posible que el receptor recibe 10 bytes de $ cadena1, después 30 bytes de $ cadena2, y luego otros 25 bytes de $ cadena1 ... y así sucesivamente ....

Respuesta

6

Depende en el protocolo que usa el socket. Ver socket_create para los tipos posibles de enchufes. Los principales tipos son UDP y TCP:

UDP El Protocolo de datagramas de usuario es un fiable y sin conexión, protocolo con longitudes de registro fijos. Debido a estos aspectos, UDP requiere una cantidad mínima de sobrecarga de protocolo.

tcp El Protocolo de control de la transmisión es un protocolo confiable, basado en la conexión, orientado a la corriente, dúplex completo. TCP garantiza que todos los paquetes de datos se recibirán en el orden en que se enviaron. Si algún paquete se pierde de alguna manera durante la comunicación, TCP retransmitirá automáticamente el paquete hasta que el servidor de destino reconozca ese paquete. Por razones de confiabilidad y rendimiento, la implementación de TCP decide los límites de octetos apropiados de la capa de comunicación del datagrama subyacente. Por lo tanto, las aplicaciones TCP deben permitir la posibilidad de transmisión parcial de registros.

Para responder a su pregunta directamente, los sockets TCP garantizarán la entrega ordenada, mientras que los sockets UDP no lo harán.

+0

+1 También vea http://stackoverflow.com/questions/1432477/can-php-asynchronously-use-sockets – msanford

+2

Eso significa para mi ejemplo anterior: los sockets TCP garantizarán que el receptor nunca verá los datos de $ string2 , 3 o 4 hasta $ string1 se recibió por completo? – Mike

+2

Sí, pero tenga en cuenta que todos los datos están escritos en el mismo socket, por lo que el receptor verá los datos como una única fuente de información. A menos que agregue longitudes de cadena, delimitadores u otra información a sus datos, el receptor no sabrá dónde '$ string1' termina y' $ string2' comienza. –

Cuestiones relacionadas