खोज…
टीसीपी क्लाइंट सॉकेट
एक सॉकेट बनाना जो टीसीपी (ट्रांसमिशन कंट्रोल प्रोटोकॉल) का उपयोग करता है
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
सुनिश्चित करें कि सॉकेट सफलतापूर्वक बनाया गया है। onSocketFailure
फ़ंक्शन इस विषय में सॉकेट त्रुटियों के उदाहरण से निपटने के लिए आता है।
if(!is_resource($socket)) onSocketFailure("Failed to create socket");
सॉकेट को एक निर्दिष्ट पते से कनेक्ट करें
यदि कनेक्शन विफल हुआ तो दूसरी पंक्ति सुंदर रूप से विफल हो जाती है।
socket_connect($socket, "chat.stackoverflow.com", 6667)
or onSocketFailure("Failed to connect to chat.stackoverflow.com:6667", $socket);
सर्वर पर डेटा भेजना
socket_write
फ़ंक्शन सॉकेट के माध्यम से बाइट भेजता है। PHP में, एक बाइट सरणी को एक स्ट्रिंग द्वारा दर्शाया जाता है, जो सामान्य रूप से एन्कोडिंग-असंवेदनशील होता है।
socket_write($socket, "NICK Alice\r\nUSER alice 0 * :Alice\r\n");
सर्वर से डेटा प्राप्त करना
निम्न स्निपेट socket_read
फ़ंक्शन का उपयोग करके सर्वर से कुछ डेटा प्राप्त करता है।
तीसरे पैरामीटर के रूप में PHP_NORMAL_READ
पास PHP_NORMAL_READ
एक \r
/ \n
बाइट तक पढ़ता है, और यह बाइट वापसी मूल्य में शामिल है।
PHP_BINARY_READ
के विपरीत, स्ट्रीम से डेटा की आवश्यक मात्रा को पढ़ता है।
यदि socket_set_nonblock
को पहले बुलाया गया था, और PHP_BINARY_READ
का उपयोग किया जाता है, तो socket_read
तुरंत false
हो जाएगा। अन्यथा, विधि पर्याप्त डेटा तक ब्लॉक (दूसरे पैरामीटर में लंबाई तक पहुंचने के लिए, या एक पंक्ति समाप्त होने तक पहुंचने के लिए) प्राप्त होती है, या सॉकेट बंद हो जाती है।
यह उदाहरण माना जाता है कि आईआरसी सर्वर से डेटा पढ़ता है।
while(true) {
// read a line from the socket
$line = socket_read($socket, 1024, PHP_NORMAL_READ);
if(substr($line, -1) === "\r") {
// read/skip one byte from the socket
// we assume that the next byte in the stream must be a \n.
// this is actually bad in practice; the script is vulnerable to unexpected values
socket_read($socket, 1, PHP_BINARY_READ);
}
$message = parseLine($line);
if($message->type === "QUIT") break;
}
सॉकेट बंद करना
सॉकेट को बंद करना सॉकेट और उससे जुड़े संसाधनों को मुक्त करता है।
socket_close($socket);
टीसीपी सर्वर सॉकेट
सॉकेट निर्माण
एक सॉकेट बनाएं जो टीसीपी का उपयोग करता है। यह क्लाइंट सॉकेट बनाने के समान है।
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
सॉकेट बाइंडिंग
सॉकेट के लिए एक विशिष्ट नेटवर्क (पैरामीटर 3) के लिए किसी दिए गए नेटवर्क (पैरामीटर 2) से कनेक्शन बांधें।
दूसरा पैरामीटर आमतौर पर "0.0.0.0"
, जो सभी नेटवर्क से कनेक्शन स्वीकार करता है। यह भी हो सकता है
socket_bind
से त्रुटियों का एक सामान्य कारण यह है कि निर्दिष्ट पता पहले से ही किसी अन्य प्रक्रिया से जुड़ा हुआ है । अन्य प्रक्रियाओं को आमतौर पर मार दिया जाता है (आमतौर पर मैन्युअल रूप से गलती से महत्वपूर्ण प्रक्रियाओं को मारने से रोकने के लिए) ताकि सॉकेट्स को मुक्त किया जा सके।
socket_bind($socket, "0.0.0.0", 6667) or onSocketFailure("Failed to bind to 0.0.0.0:6667");
सुनने के लिए एक सॉकेट सेट करें
सॉकेट बनाओ socket_listen
का उपयोग करके आने वाले कनेक्शनों को socket_listen
। दूसरा पैरामीटर स्वीकार किए जाने से पहले कतार की अनुमति देने के लिए कनेक्शन की अधिकतम संख्या है।
socket_listen($socket, 5);
कनेक्शन संभालना
टीसीपी सर्वर वास्तव में एक सर्वर है जो बच्चे के कनेक्शन को संभालता है। socket_accept
एक नया बच्चा कनेक्शन बनाता है।
$conn = socket_accept($socket);
socket_accept
से कनेक्शन के लिए डेटा ट्रांसफरिंग टीसीपी क्लाइंट सॉकेट के लिए समान है।
जब यह कनेक्शन बंद होना चाहिए, तो socket_close($conn);
कॉल करें socket_close($conn);
सीधे। यह मूल टीसीपी सर्वर सॉकेट को प्रभावित नहीं करेगा।
सर्वर को बंद करना
दूसरी ओर, socket_close($socket);
जब सर्वर का उपयोग नहीं किया जाता है तो उसे कॉल किया जाना चाहिए। यह टीसीपी पते के रूप में अच्छी तरह से मुक्त होगा, अन्य प्रक्रियाओं को पते पर बांधने की अनुमति देगा।
सॉकेट त्रुटियों को संभालना
सॉकेट एक्सटेंशन से अंतिम त्रुटि की त्रुटि आईडी प्राप्त करने के लिए socket_last_error
का उपयोग किया जा सकता है।
socket_strerror
का उपयोग ID को मानव-पठनीय तारों में परिवर्तित करने के लिए किया जा सकता है।
function onSocketFailure(string $message, $socket = null) {
if(is_resource($socket)) {
$message .= ": " . socket_strerror(socket_last_error($socket));
}
die($message);
}
यूडीपी सर्वर सॉकेट
टीसीपी के विपरीत, एक यूडीपी (उपयोगकर्ता डेटाग्राम प्रोटोकॉल) सर्वर स्ट्रीम-आधारित नहीं है। यह पैकेट-आधारित है, अर्थात एक क्लाइंट सर्वर को "पैकेट" नामक इकाइयों में डेटा भेजता है, और क्लाइंट अपने पते से ग्राहकों की पहचान करता है। कोई अंतर्निहित कार्य नहीं है जो एक ही क्लाइंट से भेजे गए विभिन्न पैकेटों से संबंधित है (टीसीपी के विपरीत, जहां एक ही क्लाइंट से डेटा socket_accept
द्वारा बनाए गए एक विशिष्ट संसाधन द्वारा नियंत्रित किया जाता है)। यह सोचा जा सकता है कि हर बार जब एक यूडीपी पैकेट आता है तो एक नया टीसीपी कनेक्शन स्वीकार किया जाता है और उसे बंद कर दिया जाता है।
UDP सर्वर सॉकेट बनाना
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
एक पते पर एक सॉकेट बांधना
एक टीसीपी सर्वर के लिए पैरामीटर समान हैं।
socket_bind($socket, "0.0.0.0", 9000) or onSocketFailure("Failed to bind to 0.0.0.0:9000", $socket);
पैकेट भेजना
यह लाइन एक यूडीपी पैकेट में $address
: $port
को $data
भेजती है।
socket_sendto($socket, $data, strlen($data), 0, $address, $port);
एक पैकेट प्राप्त करना
निम्न स्निपेट क्लाइंट-अनुक्रमित तरीके से UDP पैकेट को प्रबंधित करने का प्रयास करता है।
$clients = [];
while (true){
socket_recvfrom($socket, $buffer, 32768, 0, $ip, $port) === true
or onSocketFailure("Failed to receive packet", $socket);
$address = "$ip:$port";
if (!isset($clients[$address])) $clients[$address] = new Client();
$clients[$address]->handlePacket($buffer);
}
सर्वर को बंद करना
socket_close
का उपयोग UDP सर्वर सॉकेट संसाधन पर किया जा सकता है। यह यूडीपी पते को मुक्त करेगा, अन्य प्रक्रियाओं को इस पते पर बाँधने की अनुमति देगा।