"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > गो के नॉन-ब्लॉकिंग टीसीपी रीड्स में अपूर्ण डेटा रिसेप्शन को कैसे संभालें?

गो के नॉन-ब्लॉकिंग टीसीपी रीड्स में अपूर्ण डेटा रिसेप्शन को कैसे संभालें?

2024-11-08 को प्रकाशित
ब्राउज़ करें:188

How to Handle Incomplete Data Reception in Go\'s Non-Blocking TCP Reads?

गो टीसीपी रीड नॉन-ब्लॉकिंग है: अपूर्ण डेटा रिसेप्शन को संबोधित करना

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

उदाहरण:

पैकेज मुख्य आयात ( "एफएमटी" "जाल" "समय" ) func मुख्य() { कॉन, _ := नेट.डायल("टीसीपी", "127.0.0.1:4243") // पढ़ने को लटकने से रोकने के लिए एक समय सीमा निर्धारित करें _ = conn.SetReadDeadline(time.Now().Add(10 * time.Second)) // एक नई पंक्ति सामने आने तक पढ़ने के लिए लूप करें के लिए { buf := बनाओ([]बाइट, 512) n, err := conn.Read(buf) यदि त्रुटि !=शून्य { fmt.Println(त्रुटि) तोड़ना } यदि n > 0 { str := स्ट्रिंग(buf[:n]) यदि str[len(str)-1] == '\n' { fmt.Println(str) तोड़ना } } } }

अन्य विचार

एक ही लेखन के लिए एकाधिक पैकेट की संभावना को संभालें।संदेश सीमाओं को परिभाषित करने के लिए सीमांकक या अन्य तरीकों का उपयोग करें .

package main

import (
    "fmt"
    "net"
    "time"
)

func main() {
    conn, _ := net.Dial("tcp", "127.0.0.1:4243")

    // Set a deadline to prevent hanging reads
    _ = conn.SetReadDeadline(time.Now().Add(10 * time.Second))

    // Loop to read until a newline is encountered
    for {
        buf := make([]byte, 512)
        n, err := conn.Read(buf)
        if err != nil {
            fmt.Println(err)
            break
        }
        if n > 0 {
            str := string(buf[:n])
            if str[len(str)-1] == '\n' {
                fmt.Println(str)
                break
            }
        }
    }
}
संसाधन की कमी को रोकने के लिए टाइमआउट या समय सीमा लागू करें।

मास्किंग समस्याओं से बचने के लिए नेटवर्क संचालन से सभी त्रुटियों की समीक्षा करें।

नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3