2009-12-09 17 views
5

मैं IO::Socket::INET उपयोग कर रहा हूँ इस तरह सॉकेट बनाने के लिए: तोपर्ल निरंतर लिखने के बाद सॉकेट प्रोग्रामिंग समस्याओं सॉकेट से

$lsn1 = IO::Socket::INET->new(
          PeerAddr => '192.168.0.2', 
          PeerPort => 1850, 
          Proto => 'tcp', 
          Type  => SOCK_STREAM 
    ) || die "Can't connect to 192.168.0.2:1850 : $!\n"; 

$lsn2 = IO::Socket::INET->new(
          PeerAddr => '192.168.0.2', 
          PeerPort = >1852, 
          Proto => 'tcp', 
          Type  => SOCK_STREAM 
    ) || die "Can't connect to 192.168.0.2:1852 : $!\n"; 

, मैंने पढ़ा है और दोनों सॉकेट के लिए डेटा लिखने के लिए चाहते हैं, तो अनुक्रम है:

1. $lsn1->print(msg1); send message 1 to server from $lsn1. 
2. $line = <$lsn2>;  receive message 2 from server from $lsn2. 
3. $lsn2->print(msg3); send message 3 to server from $lsn2. 
4. $lsn2->print(msg4); send message 4 to server from $lsn2. 
5. $line = <$lsn2>;  receive message 5 from server. But it is all zeros! However I can 
         see the data on wireshark. 

सबकुछ चरण 5 तक ठीक है। सर्वर पक्ष के बाद मेरा संदेश 4 प्राप्त होता है और msg5 को वापस भेजता है जिसे $line = <$lsn2> पर कैप्चर किया जाना चाहिए, अर्थपूर्ण मूल्य कैप्चर करने के बजाय यह सभी 0s को कैप्चर करता है। मैंने यह देखने के लिए वायरशर्क का इस्तेमाल किया कि क्या हुआ, सर्वर के बाद मुझे भेजने के बाद मेरी तरफ से एक आरएसटी एसीके भेज दिया गया था।

सर्वर में एक फ़ंक्शन msg4 प्राप्त हुआ और तुरंत msg5 भेजें। अगर मैं उस फ़ंक्शन में msg4 को भेजने से छुटकारा पाता हूं, तो msgstr 0 संदेश भेजने के बाद FIN ACK है।

क्या कोई मुझे बता सकता है कि RST ACK क्यों हो रहा है? क्या एक पर्ल स्क्रिप्ट दो सॉकेट खोल सकती है और मैंने पढ़ा और लिखना पसंद किया।

+0

जब आप "सभी शून्य" कहते हैं तो आपका क्या मतलब है? क्या आपको खाली स्ट्रिंग, अपरिफ, या वास्तव में शून्य का गुच्छा मिलता है? – innaM

+0

'$!' (और '$^ई') – mob

+0

" सभी शून्य "का अर्थ है कि आने वाली संदेश को संग्रहीत करने के लिए उपयोग की जाने वाली स्ट्रिंग खाली है। मैं सभी शून्य देखता हूं क्योंकि मैं स्ट्रिंग को वर्ण सरणी में पैक करता हूं। – user195678

उत्तर

3

यह संभव है कि आप सॉकेट (लाइन फीड, नल कैरेक्टर इत्यादि) पर कुछ डेटा छोड़कर संदेश 2 पूरी तरह से पढ़ रहे हों। जब आप संदेश 5 को पढ़ने का प्रयास करते हैं तो आप इस डेटा को पढ़ते हैं और सर्वर वास्तव में संदेश भेजता है इससे पहले आपका प्रोग्राम समाप्त हो जाता है।

+0

यह संभव है। दो सॉकेट बनाने के बाद, मैंने $ lsn1-> autoflush (1) और $ lsn2-> autoflush (2) को जोड़ा। मैं यह देखने के लिए का परीक्षण कर रहा हूं कि यह ठीक है या नहीं। – user195678

संबंधित मुद्दे