टीसीपी ग्राहक फेंक नहीं है त्रुटि से कनेक्ट करने के लिए स्थानीय होस्ट यदि कोई सर्वर के लिए तैयार है

0

सवाल

मैं करने की कोशिश की encapsulate करने के लिए सभी नेटवर्किंग functionalities के लिए अपने कार्यक्रम के अंदर एक "SimpleClient" वर्ग है, जो दिखाता है इस अंतरफलक के अंदर .hpp फाइल:

class SimpleClient{
    //private
        boost::shared_ptr<boost::asio::ip::tcp::socket> signal_socket; 
    protected: 
        boost::asio::io_context my_context;
        ClientState state; //0: Ready to be used, not connected,  -1: error, 1: Connected/active, 
    public: 
       SimpleClient();
       virtual bool connect(const char* ip_address);
       virtual void disconnect();
       virtual bool sendMessage(const char* msg, int length);
       virtual int getResponse( char* msg, int length, int timeout);
       virtual int getSignalData( char* msg, int length);
       virtual ClientState getState();
};

परीक्षण करते समय कनेक्ट विधि मैंने देखा है कि यहां तक कि अगर कोई सर्वर पर इंतजार कर रहा था स्थानीय होस्ट पोर्ट पर 8887, कनेक्ट नहीं किया था एक त्रुटि फेंक देना. मैं कैसे कर सकते हैं की जाँच करें कि सॉकेट से जुड़ा है असली के लिए है?

यहाँ तरीके कि मैं लागू किया है और एक छोटा सा उदाहरण है कि reproduces अपने व्यवहार, उपयोग को बढ़ावा देने के । परीक्षण:

SimpleClient::SimpleClient() : my_context() {
    signal_socket.reset();
    state = ClientState::CL_UNCON;
}

bool SimpleClient::connect(const char* ip_address) {
    boost::system::error_code ec;
    if (signal_socket != NULL && signal_socket->is_open() )
        return true;
    try {
        boost::asio::ip::tcp::endpoint signal_endpoint(boost::asio::ip::make_address(ip_address), 8887);
        signal_socket.reset(new boost::asio::ip::tcp::socket(my_context));
        signal_socket->connect(signal_endpoint, ec);
        if(ec) {
            std::cout<<ec.message()<<" "<<ec.value()<<std::endl;
            return false;
        }
    } catch(const boost::system::system_error& ex) {
        std::cout<<ex.code()<<std::endl;
        return false;
    }
    std::cout<<signal_socket<<std::endl;
    state = ClientState::CL_READY;
    return true;
}

यहाँ है परीक्षा कार्यक्रम:

#define BOOST_AUTO_TEST_MAIN 
#define BOOST_TEST_DYN_LINK

#include "SimpleClient.hpp"

#include <boost/test/unit_test.hpp>

#include <string.h>

#define TARGET_IP "127.0.0.1"
#define BAD_IP "128.0.0.1"


BOOST_AUTO_TEST_CASE(connection_test)  {
    bool ret;
    std::cout<<"Connect to WRONG address"<<std::endl;
    SimpleClient* ut = new SimpleClient();
    BOOST_CHECK_EQUAL(ut->getState(), ClientState::CL_UNCON);
    ret = ut->connect(BAD_IP);
    BOOST_CHECK(!ret);
    std::cout<<"Connect to RIGHT address"<<std::endl;
    ret = ut->connect(TARGET_IP);
    BOOST_CHECK(ret);
    ut->disconnect();
    try{
        delete ut;
    }
    catch(const std::exception& ex) {
        std::cout<<ex.what()<<std::endl;
    }
    catch(...) {
    }
} 
boost boost-asio c++ tcp
2021-11-22 09:30:07
1

सबसे अच्छा जवाब

1

समस्या यह थी मेरी कनेक्ट विधि है, जाहिर है । पहली कॉल करने के लिए कनेक्ट मेरे परीक्षण में विफल रहा है, लेकिन यह बंद नहीं किया सॉकेट, तो दूसरी कॉल स्वचालित रूप से लौट आए सच प्रदर्शन के बिना किसी भी आपरेशन ।

TLDR: विफलता के मामले में, कनेक्ट को बंद नहीं करता है गर्तिका के हैं, और किसी भी कॉल करने के लिए is_open() होगा 'सच' वापसी, कॉल मैन्युअल रूप से बंद() विधि सॉकेट पर त्रुटि के मामले में.

bool SimpleClient::connect(const char* ip_address) {
    boost::system::error_code ec;
    if (signal_socket != NULL && signal_socket->is_open() )
        return true;
    try {
        boost::asio::ip::tcp::endpoint signal_endpoint(boost::asio::ip::make_address(ip_address), 8887);
        signal_socket.reset(new boost::asio::ip::tcp::socket(my_context));
        signal_socket->connect(signal_endpoint, ec);
        if(ec) {
            std::cout<<ec.message()<<" "<<ec.value()<<std::endl;
            signal_socket->close();
            signal_socket.reset();
            return false;
        }
    } catch(const boost::system::system_error& ex) {
        std::cout<<ex.code()<<std::endl;
        signal_socket->close();
        signal_socket.reset();
        return false;
    }
    std::cout<<signal_socket<<std::endl;
    state = ClientState::CL_READY;
    return true;
}
2021-11-22 14:52:56

वैकल्पिक रूप से समायोजित नियंत्रण प्रवाह इतना है कि सॉकेट नहीं किया जाता है के बाद एक त्रुटि है. यह अधिक प्राकृतिक दृष्टिकोण है. अक्सर जाँच "is_open" नहीं है क्या आप के बाद कर रहे हैं वैसे भी (उदाहरण के लिए यह करने में सक्षम नहीं होगा, जब पता लगाने के दूरदराज के अंत में बंद एक कनेक्शन है). +1 का जवाब देने के लिए अपने खुद के सवाल हालांकि!
sehe

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में