मुझे लगता है कि मैं std :: io :: टीसीपीस्ट्रीम के साथ संघर्ष कर रहा हूं। मैं वास्तव में किसी अन्य सिस्टम के साथ एक टीसीपी कनेक्शन खोलने की कोशिश कर रहा हूं लेकिन नीचे दिया गया कोड वास्तव में समस्या का अनुकरण करता है।जंग लगातार टीसीपीस्ट्रीम
मेरे पास एक टीसीपी सर्वर है जो खोलने पर टीसीपीस्ट्रीम को "हैलो वर्ल्ड" लिखता है और फिर कनेक्शन को खोलने के लिए लूप करता है।
fn main() {
let listener = io::TcpListener::bind("127.0.0.1", 8080);
let mut acceptor = listener.listen();
for stream in acceptor.incoming() {
match stream {
Err(_) => { /* connection failed */ }
Ok(stream) => spawn(proc() {
handle(stream);
})
}
}
drop(acceptor);
}
fn handle(mut stream: io::TcpStream) {
stream.write(b"Hello Connection");
loop {}
}
सभी क्लाइंट कनेक्शन से एक बाइट पढ़ने और इसे प्रिंट करने का प्रयास करता है।
fn main() {
let mut socket = io::TcpStream::connect("127.0.0.1", 8080).unwrap();
loop {
match socket.read_byte() {
Ok(i) => print!("{}", i),
Err(e) => {
println!("Error: {}", e);
break
}
}
}
}
अब समस्या मेरे मुवक्किल पढ़ने पर अवरुद्ध रहता है जब तक मैं सर्वर को मारने या टीसीपी कनेक्शन बंद है। यह वही नहीं है जो मुझे चाहिए, मुझे बहुत लंबे समय तक एक टीसीपी कनेक्शन खोलना होगा और क्लाइंट और सर्वर के बीच संदेश भेजना होगा। मैं यहाँ क्या गलत समझ रहा हूँ? मेरे पास वास्तविक प्रणाली के साथ एक ही समस्या है जिसके साथ मैं संचार कर रहा हूं - कनेक्शन को मारने के बाद ही मैं अनब्लॉक हो जाता हूं।
ठीक है तो मैं उचित एसिंक्रोनस I/O ... बमर करने में सक्षम नहीं होगा। लेकिन कनेक्शन बंद होने तक मैं टीसीपीस्ट्रीम से डेटा क्यों नहीं पढ़ सकता? क्या यह ईओएफ तक सभी डेटा बफर करने के लिए लागू किया गया है? – Upio
@Upio, क्या आपने यह नहीं कहा: "अब समस्या यह है कि जब तक मैं सर्वर को मारता या टीसीपी कनेक्शन बंद नहीं करता तब तक मेरा क्लाइंट पढ़ने पर अवरुद्ध रहता है"? यह "कनेक्शन बंद होने तक टीसीपीस्ट्रीम से डेटा पढ़ रहा है", है ना? वैसे भी, 'टीसीपीस्ट्रीम' एक ['रीडर'] है (http://doc.rust-lang.org/std/io/trait.Reader.html), इसलिए इसमें [' read_to_end() '] है (http://doc.rust-lang.org/std/io/trait.Reader.html#method.read_to_end) विधि जो सभी स्ट्रीम को बंद होने तक खपत करती है। क्या आपको इसकी आवश्यकता है? –
क्षमा करें अगर मैं अस्पष्ट था, मुझे पहले से ही पता है कि पाठक के साथ कैसे बातचीत करें। मैं सिर्फ यह समझना चाहूंगा कि कनेक्शन बंद होने तक ग्राहक पक्ष पर कोई डेटा क्यों नहीं पढ़ा जाता है। यहां तक कि मैं read_byte() का उपयोग करता हूं, यह कनेक्शन समाप्त होने तक ब्लॉक करता है।यह आंतरिक रूप से कैसे काम कर रहा है? – Upio