20 Stimmen

Ich kann nicht wirklich verstehen, was die Parameter für die Erstellung von tcp::resolver::query

Ich beginne mit Boost.Asio und versuche, die Beispiele auf der offiziellen Website zum Laufen zu bringen.
Hier ist der Client-Code:

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;
}

Die Frage ist - ich kann nicht herausfinden, was die Parameter wären, um das Programm von der Eingabeaufforderung auszuführen?

16voto

VolkA Punkte 31963

Sie führen das Programm mit der IP oder dem Hostnamen des Servers aus, zu dem Sie eine Verbindung herstellen wollen. tcp::resolver::query nimmt den aufzulösenden Host oder die IP als ersten Parameter und den Namen des Dienstes (wie z. B. in /etc/services auf Unix-Hosts definiert) - Sie können auch eine numerische Dienstkennung (auch Portnummer genannt) verwenden. Es wird eine Liste möglicher Endpunkte zurückgegeben, da es mehrere Einträge für einen einzelnen Host geben kann.

1 Stimmen

Tcp::resolver::query query("localhost", "daytime"); //funktioniert //ich wollte das Beispiel auf localhost testen

9voto

sergeyxzc Punkte 415

Altes Handbuch lesen!

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

5voto

ducin Punkte 24013

Ich hatte gerade das gleiche Problem (mit dem gleichen Tutorial). Ändern Sie den Server-Code zu:

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

und ändern Sie den Client-Code:

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

um denselben Dienst an einem anderen Anschluss zu betreiben.

0voto

Artyom Punkte 29856

Wenn ich mich nicht irre, versuchen Sie, eine UNICODE-Zeichenkette zu verwenden - tchar. Verwenden Sie Standard

int main(int argc,char **argv)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X