2012-03-16 28 views
8

जैसा कि मैं समझता हूं, PHP 5.x में nonblocking नेटवर्क socket बनाना संभव है।अनब्लॉकिंग सॉकेट: संदेश कतारबद्ध हैं?

लेकिन एक स्क्रिप्ट का पालन ही nonblocking सॉकेट का उपयोग कर कई लंबे संदेश भेजता है, तो क्या होता है:

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

इन संदेशों को पंक्तिबद्ध (? प्रेषक/रिसीवर की ओर) कर रहे हैं या यह संभव है कि रिसीवर हो जाता है विभिन्न संदेशों के कुछ हिस्सों क्योंकि उन्होंने "समांतर" भेजा?

उदाहरण के लिए: संभव है कि रिसीवर $ string1 के 10 बाइट्स, तो $ string2 के 30 बाइट्स हो जाता है, तो $ string1 ... और इतने पर की एक और 25 बाइट्स ....

उत्तर

6

यह निर्भर करता है प्रोटोकॉल पर सॉकेट का उपयोग कर रहा है। संभावित प्रकार के सॉकेट के लिए socket_create देखें। मुख्य प्रकार UDP और TCP हैं:

udp प्रयोक्ता आंकड़ारेख प्रोटोकॉल एक संयोजन, अविश्वसनीय, निश्चित रिकॉर्ड लंबाई के साथ प्रोटोकॉल है। इन पहलुओं के कारण, यूडीपी को प्रोटोकॉल ओवरहेड की न्यूनतम मात्रा की आवश्यकता होती है।

टीसीपी ट्रांसमिशन कंट्रोल प्रोटोकॉल एक विश्वसनीय, कनेक्शन आधारित, स्ट्रीम उन्मुख, पूर्ण डुप्लेक्स प्रोटोकॉल है। टीसीपी गारंटी देता है कि सभी डेटा पैकेट प्राप्त किए जाएंगे, जिसमें वे भेजे गए थे। यदि किसी भी पैकेट को संचार के दौरान किसी तरह खो दिया जाता है, तो टीसीपी स्वचालित रूप से पैकेट को फिर से प्रेषित कर लेगा जब तक कि गंतव्य होस्ट उस पैकेट को स्वीकार न करे। विश्वसनीयता और प्रदर्शन कारणों के लिए, टीसीपी कार्यान्वयन स्वयं अंतर्निहित डेटाग्राम संचार परत की उपयुक्त ऑक्टेट सीमाओं का निर्णय लेता है। इसलिए, टीसीपी अनुप्रयोगों को आंशिक रिकॉर्ड संचरण की संभावना के लिए अनुमति देनी चाहिए।

सीधे अपने प्रश्न का उत्तर देने के लिए, टीसीपी सॉकेट इन-ऑर्डर डिलीवरी की गारंटी देगा, जबकि यूडीपी सॉकेट नहीं होंगे।

+0

+1 यह भी देखें http://stackoverflow.com/questions/1432477/can-php-asynchronously-use-sockets – msanford

+2

इसका मतलब ऊपर मेरे उदाहरण के लिए है: टीसीपी सॉकेट गारंटी देगा कि रिसीवर $ string2 से डेटा कभी नहीं देख पाएगा , 3 या 4 जब तक $ string1 पूरी तरह से प्राप्त नहीं हुआ था? – Mike

+2

हां, लेकिन ध्यान रखें कि सभी डेटा एक ही सॉकेट पर लिखे गए हैं, इसलिए रिसीवर डेटा को जानकारी की एक स्ट्रीम के रूप में देखेगा। जब तक आप अपने डेटा में स्ट्रिंग लम्बाई, डिलीमीटर, या कुछ अन्य जानकारी जोड़ते हैं, तो रिसीवर नहीं जान पाएगा कि '$ string1' समाप्त होता है और' $ string2' शुरू होता है। –