मैं libscapi के साथ काम कर रहा हूं और बूस्ट :: एएसओ :: कनेक्ट के साथ कनेक्शन स्थापित करने का प्रयास करते समय त्रुटियां प्राप्त कर रहा हूं। मैं काम करने के लिए सरल उदाहरण प्राप्त करने की कोशिश कर रहा हूं (जैसे नीचे वाला) लेकिन मुझे हमेशा "कनेक्शन अस्वीकृत" त्रुटि मिलती है। मुझे लगता है कि यह एक बहुत ही साधारण गलती होनी चाहिए लेकिन मैं इसे समझ नहीं पा रहा हूं।

#include <boost/asio.hpp>
#include <iostream>


int main(int argc, char* argv[]) {

    boost::asio::io_service io_service; 
    boost::asio::ip::tcp::endpoint endpoint;
    boost::asio::ip::tcp::resolver resolver(io_service);
    boost::asio::ip::tcp::resolver::query query("www.boost.org", "http");
    boost::asio::ip::tcp::resolver::iterator iter = resolver.resolve(query);
    boost::asio::ip::tcp::resolver::iterator end; // End marker.

    while (iter != end)
    {
        boost::asio::ip::tcp::endpoint endpoint = *iter++;
            std::cout << endpoint << std::endl;
    }

    boost::asio::ip::tcp::socket socket(io_service);
    socket.connect(endpoint);
}

0
maarkab 19 जिंदा 2020, 23:40

2 जवाब

सबसे बढ़िया उत्तर

आप connect के लिए डिफॉल्ट निर्मित एंडपॉइंट पास कर रहे हैं, जो अभी मान्य नहीं है। जब आपके पास [iter,end) पुनरावृत्तियों द्वारा निर्दिष्ट अंतिम बिंदुओं की एक सूची है, तो आपको उनमें से प्रत्येक को connect को पास करने की जांच करनी चाहिए:

boost::asio::ip::tcp::socket socket(io_service);

while (iter != end)
{
    boost::asio::ip::tcp::endpoint endpoint = *iter++;
        std::cout << endpoint << std::endl;
    boost::system::erroc_code err;
    socket.connect(endpoint,err);
    if ( !err ) // there is no error
    {
       // connection is established, we can break loop
       break;
    }
    else {
         std::cout << "ups, we have problem" << std::endl;
    }
}

आसान संस्करण मुफ्त connect फ़ंक्शन जो दोनों पुनरावृत्तियों को लेता है:

boost::asio::ip::tcp::socket socket(io_service);
boost::system::error_code err;
boost::asio::connect(socket,iter,end,err);
if (!err)
    std::cout << "connected" << std::endl;
0
rafix07 20 जिंदा 2020, 09:53

बूस्ट एएसओ टीसीपी डेटाइम क्लाइंट उदाहरण मानता है कि आपके पास कुछ सर्वर पर अपने डिफ़ॉल्ट पोर्ट 13 पर चलने वाली एक दिन की सेवा तक पहुंच है। पोर्ट 13 पर चलने वाले सर्वर के बिना, आपको "कनेक्शन अस्वीकृत" संदेश प्राप्त होगा।

स्थानीय रूप से उदाहरण का परीक्षण करने के लिए, आपको पहले xinetd (डेबियन 10 - बस्टर) स्थापित करना होगा, फ़ाइल /etc/xinetd.d/daytime में "tcp" दिन के समय सेवा को सक्षम करना होगा, और "sudo systemctl पुनरारंभ xinetd.service" के साथ xinetd को पुनरारंभ करना होगा। फ्रीबीएसडी यूनिक्स inetd का उपयोग करता है। एक बार डेटाइम सर्विस चलने के बाद, बूस्ट उदाहरण निष्पादित करें। उदाहरण चलाते समय "होस्ट" के लिए "लोकलहोस्ट" या "127.0.0.1" दर्ज करें। एएसओ के अंदर कहीं, टीसीपी :: रिज़ॉल्वर टेक्स्ट "दिन के समय" को पोर्ट 13 पर मैप करता है।

उदाहरण का दूसरा भाग, "टीसीपी डेटाइम सर्वर", मानता है कि आपके पास पोर्ट 13 पर चलने वाला स्थानीय सर्वर नहीं है। या तो "सुडो सिस्टमक्टल स्टॉप xinetd.service" या "टीसीपी" डेटाइम सर्विस को अक्षम करें और ऊपर के रूप में xinetd को पुनरारंभ करें। यदि आपको "बाइंड: अनुमति अस्वीकृत" मिलता है, तो आपको सर्वर उदाहरण को चलाने के लिए sudo का उपयोग करने की आवश्यकता हो सकती है। एक बार जब सर्वर एक विंडो में चल रहा हो, तो एक अलग विंडो खोलें और क्लाइंट उदाहरण को फिर से चलाएँ।

0
Kenneth 11 जुलाई 2020, 22:05