खोज…


टीसीपी क्लाइंट सॉकेट

एक सॉकेट बनाना जो टीसीपी (ट्रांसमिशन कंट्रोल प्रोटोकॉल) का उपयोग करता है

$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 सर्वर सॉकेट संसाधन पर किया जा सकता है। यह यूडीपी पते को मुक्त करेगा, अन्य प्रक्रियाओं को इस पते पर बाँधने की अनुमति देगा।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow