لا يمكن أن نفهم حقا ما المعلمات لبناء TCP :: محلول :: استعلام

StackOverflow https://stackoverflow.com/questions/551226

  •  23-08-2019
  •  | 
  •  

سؤال

أنا بدأت Bost.asio ومحاولة تقديم أمثلة ممنوحة على موقع الويب الرسمي.
هنا رمز العميل:


using boost::asio::ip::tcp;

int _tmain(int argc, _TCHAR* argv[])
{
    try {
        boost::asio::io_service io_service;

        tcp::resolver resolver(io_service);
        tcp::resolver::query query(argv[1], "daytime");
        tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
        tcp::resolver::iterator end;

        tcp::socket socket(io_service);
        boost::system::error_code error = boost::asio::error::host_not_found;
        while(error && endpoint_iterator != end) {
            socket.close();
            socket.connect(*endpoint_iterator++, error);
        }
        if (error)
            throw boost::system::system_error(error);

        for(;;) {
            boost::array buf;
            boost::system::error_code error;

            std::size_t len = socket.read_some(boost::asio::buffer(buf), error);

            if (error == boost::asio::error::eof)
                break; //connection closed cleanly by peer
            else if (error)
                throw boost::system::system_error(error);

            std::cout.write(buf.data(), len);
        }
    }
    catch(std::exception& e) {
        //...
    }
    return 0;
}

السؤال هو - لا أستطيع معرفة ما سيكون عليه المعلمات لتشغيل البرنامج من موجه الأوامر؟

هل كانت مفيدة؟

المحلول

يمكنك تشغيل البرنامج باستخدام IP أو اسم المضيف للخادم الذي تريد الاتصال به. TCP :: محلل :: استعلام يأخذ المضيف لحل أو IP كمعلمة الأولى واسم الخدمة (كما هو محدد، على سبيل المثال / إلخ / خدمات على مضيفين UNIX) - يمكنك أيضا استخدام معرف خدمة رقمي (منفذ AKA رقم). تقوم بإرجاع قائمة من نقاط النهاية المحتملة، حيث قد يكون هناك العديد من الإدخالات لمضيف واحد.

نصائح أخرى

قراءة الدليل القديم!

ip::tcp::resolver resolver(my_io_service);
ip::tcp::resolver::query query("www.boost.org", "http");
ip::tcp::resolver::iterator iter = resolver.resolve(query);
ip::tcp::resolver::iterator end; // End marker.
while (iter != end)
{
    ip::tcp::endpoint endpoint = *iter++;
    std::cout << endpoint << std::endl;
}

http://www.boost.org/doc/libs/1_38_0/doc/html/boost_asio/overview/networking/protocols.html.

كان لدي نفس المشكلة الآن (مع نفس البرنامج التعليمي). تغيير رمز الخادم إلى:

tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), 19876));

وتغيير رمز العميل:

tcp::resolver::query query(argv[1], "19876");

لجعل نفس الخدمة تعمل على منفذ مختلف.

إذا لم أكن أخطأا، فأنت تحاول استخدام سلسلة Unicode - Tchar. يستخدم اساسي

int main(int argc,char **argv)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top