2012-03-16 18 views
8

Come ho capito, è possibile creare una rete nonblockingsocket in PHP 5.x.Zoccoli non bloccanti: i messaggi sono in coda?

Ma cosa succede se uno script invia diversi messaggi lunghi tramite la stessa presa non bloccante come segue:

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

Sono questi messaggi in coda (? Sul lato mittente/destinatario) o è possibile che il ricevitore ottiene parti di diversi messaggi perché hanno inviato "parallelo"?

Ad esempio: Is è possibile che il destinatario riceve 10 byte di $ stringa1, poi 30 byte di $ stringa2, poi altri 25 byte di $ stringa1 ... e così via ....

risposta

6

Dipende sul protocollo utilizzato dal socket. Vedi socket_create per i possibili tipi di socket. I tipi principali sono UDP e TCP:

UDP L'User Datagram Protocol è una connessione, inaffidabile protocollo con record di lunghezza fissa. A causa di questi aspetti, UDP richiede una quantità minima di overhead del protocollo.

tcp Il Transmission Control Protocol è un protocollo affidabile, basato su connessione, orientato allo stream, full duplex. TCP garantisce che tutti i pacchetti di dati saranno ricevuti nell'ordine in cui sono stati inviati. Se qualche pacchetto viene in qualche modo perso durante la comunicazione, TCP ritrasmetterà automaticamente il pacchetto fino a quando l'host di destinazione non riconoscerà quel pacchetto. Per motivi di affidabilità e prestazioni, l'implementazione TCP stessa decide i limiti ottetti appropriati del livello di comunicazione del datagramma sottostante. Pertanto, le applicazioni TCP devono consentire la possibilità di una trasmissione parziale dei record.

Per rispondere direttamente alla domanda, le prese TCP garantiscono la consegna in ordine, mentre le socket UDP no.

+0

+1 Vedere anche http://stackoverflow.com/questions/1432477/can-php-asynchronously-use-sockets – msanford

+2

Ciò significa per il mio esempio sopra: i socket TCP garantiranno che il ricevitore non vedrà mai i dati da $ string2 , 3 o 4 fino a $ stringa1 è stata ricevuta completamente? – Mike

+2

Sì, ma tieni presente che tutti i dati vengono scritti sullo stesso socket, quindi il destinatario vedrà i dati come un singolo flusso di informazioni. A meno che non si aggiungano lunghezze, delimitatori o altre informazioni sui dati, il ricevitore non saprà dove termina '$ string1' e inizia $ String2'. –