Saturday 15 May 2010

C++: BOOST-ASIO No server causes client to crash? -


कनेक्टर पर निम्नलिखित कोड क्रैश हो जाता है boost :: asio :: connect (s, iterator); आउटपुट के साथ: <प्री> कनेक्टर से पहले: यह एप्लिकेशन रनटाइम को असामान्य तरीके से समाप्त करने का अनुरोध किया है। अधिक जानकारी के लिए कृपया एप्लिकेशन की सहायता टीम से संपर्क करें। प्रक्रिया ने 3 (0x3) निष्पादन समय वापस किया: 1.281 s जारी रखने के लिए कोई भी कुंजी दबाएं।

मेरे पास स्थानीय सर्वर से पोर्ट 4001 पर चलने वाला कोई सर्वर नहीं है और मुझे आश्चर्य है कि अगर इस क्रैश को रोकने के लिए कोई रास्ता नहीं है, तो सर्वर कुछ के लिए नहीं चल रहा है कारण अभी तक ग्राहक अभी भी सॉफ़्टवेयर को कुछ हद तक चल सकता है दूसरे शब्दों में, क्या यह देखने का एक तरीका है कि कोई सर्वर प्रोग्राम को दुर्घटनाग्रस्त होने के बिना मौजूद है या नहीं?

यह कोड है

  // // blocking_tcp_echo_client.cpp // ~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // कॉपीराइट (सी) 2003-2012 क्रिस्टोफर एम। कोहलॉफ़ (क्रिस कोहलहॉफ़ डॉट कॉम में) // / / बूस्ट सॉफ्टवेयर लाइसेंस, संस्करण 1.0 के तहत वितरित। (Http://www.boost.org/LICENSE_1_0.txt पर // फ़ाइल LICENSE_1_0.txt के साथ देखें या प्रतिलिपि देखें) # # शामिल करें & lt; cstdlib & gt; # शामिल करें & lt; cstring & gt; # शामिल करें & lt; iostream & gt; # शामिल करें & lt; boost / asio.hpp & gt; Boost :: asio :: ip :: tcp का उपयोग कर रहा है; Enum {max_length = 1024}; Int main (int argc, char * argv []) {// try // {// if (argc! = 3) // {// std :: cerr & lt; & lt; "उपयोग: अवरोधक_टीसीपी_चो_क्लंट & lt; होस्ट & gt; & lt; पोर्ट & gt; \ n"; // वापसी 1; //} boost :: asio :: io_service io_service; Tcp :: रिलावर रिज़ॉल्वर (io_service); // tcp :: रिज़ॉल्वर :: क्वेरी क्वेरी (टीसीपी :: वी 4 (), एजीआर [1], एजीआर [2]); Tcp :: रिजःवर :: क्वेरी क्वेरी (टीसीपी :: वी 4 (), "127.0.0.1", "4001"); Tcp :: रिजॉल्वर :: इटरेटर इटरेटर = रिज़ॉल्वर। रिसोल (क्वेरी); Tcp :: सॉकेट एस (io_service); Std :: cout & lt; & lt; "कनेक्टर से पहले:"; बढ़ावा :: एएसआईओ :: कनेक्ट (एस, इटरेटर); Std :: cout & lt; & lt; "कनेक्टर के बाद:"; नेमस्पेस एसटीडी का उपयोग करना; // स्ट्रेलन के लिए Std :: cout & lt; & lt; "संदेश दर्ज करें:"; चार अनुरोध [max_length]; Std :: cin.getline (अनुरोध, max_length); Size_t request_length = strlen (अनुरोध); Boost :: asio :: write (s, boost :: asio :: buffer (अनुरोध, request_length)); चार उत्तर [max_length]; Size_t answer_length = boost :: asio :: read (एस, बढ़ावा :: एएसओ :: बफर (उत्तर, अनुरोध_ लैंघ)); Std :: cout & lt; & lt; "उत्तर है:"; Std :: cout.write (उत्तर, उत्तर_ लैंबी); Std :: cout & lt; & lt; "\ N"; //} // catch (std :: exception & amp; e) // {// std :: cerr & lt; & lt; "अपवाद:" & lt; & lt; E.what () & lt; & lt; "\ N"; //} वापसी 0; }    

बढ़ावा :: asio :: connect पर फेंकता है त्रुटि। इसलिए कोशिश {} ब्लॉक और कैच {} ब्लॉक जो कि टिप्पणी की गई है, क्रैशिंग के बजाय त्रुटि का पता लगाने के लिए उपयोगी होगा।

रिज़ॉल्वर। रिसोल (क्वेरी) रिटर्न .end () एक वैध इटरेटर के बजाय यदि पोर्ट नहीं मिला है, तो आप इसे बहाल प्रलेखन से connect

कॉल करने से पहले इटरेटर का परीक्षण कर सकते हैं:

  • @ थ्रू बूस्ट :: प्रणाली :: system_error विफलता पर फेंक दिया। यदि अनुक्रम
  • खाली है, तो संबद्ध @ c error_code boost :: asio :: error :: not_found।
  • अन्यथा, इसमें अंतिम कनेक्शन प्रयास से त्रुटि है।

No comments:

Post a Comment