0

ブーストを使用してクライアント クラス (UDP) を作成しようとしています。短い udp クライアント チュートリアルを、接続を処理できるクラスに変えようとしています。私は、ネットワーク プログラミング、ブースト、またはエラーの検出にあまり詳しくありません。対処する回答をいただければ幸いです

  • resolve 関数が未処理の例外を返すのはなぜですか? と
  • 例外を処理するために適切なチェックを行うにはどうすればよいですか。

役立つ TCPClient の質問を見つけましたが、いくつかの違い (非同期のクライアント/サーバーをまだ実行しようとはしていません) により、私の問題には役に立ちません。

コードは次のとおりです。

クライアントクラス

class Client {
private:
    boost::asio::io_service* io;
    udp::resolver* res;
    udp::endpoint ep;
    std::string ip;
    udp::socket* sock;
    boost::system::error_code err;

public:
    Client(boost::asio::io_service& IO, std::string IP, std::string msg) : io(&IO) , ip(IP) ,
        res(new udp::resolver(IO)) , sock(new udp::socket(IO)) { 
            udp::resolver::query qry(udp::v4(), IP, msg);
            udp::resolver::iterator epit;
            ep = *res->resolve(qry); //unhandled exception here
        
    }
    ~Client() {
        delete res; delete sock; 
    }
    void Send(std::string & sbuf) {
        sock->open(udp::v4());
        sock->send_to(boost::asio::buffer(sbuf), ep);
    }
    void Listen() {
        std::array<char,128> rbuf;
        udp::endpoint sender_ep;
        size_t len = sock->receive_from(boost::asio::buffer(rbuf), sender_ep);
        std::cout.write(rbuf.data(),len);
    }
};

プログラムは、コンストラクターで未処理の例外を受け取ります (コメントされているように)。正確なエラーは

Unhandled exception at at 0x74C6C41F in Client.exe: Microsoft C++ exception:
boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<
boost::system::system_error> > at memory location 0x0022F278.

主なプログラムは

int main() {
    boost::asio::io_service io;
    boost::system::error_code MyErr;

    Client Me(io,"127.0.0.1","MARCO");
    std::string msg = "MARCO";

    Me.Send(msg);
    Me.Listen();

    

    return 0;
}

私はすでに別のプログラムでサーバークラスを作成して実行しています。これは正しく設定されていると思いますが、問題の一部である可能性があります

#include <iostream>
#include <thread>
#include <array>
#include <boost\asio.hpp>
#include <string>

using boost::asio::ip::udp;

class Server {
private:

    boost::asio::io_service* io;
    udp::socket* sock;
    unsigned short port;
    
    std::array<char,1> rbuf;
    udp::endpoint rmtEP;
    boost::system::error_code err, ierr;

public:
    Server(boost::asio::io_service& IO, unsigned short PORT) : io(&IO) ,
        sock(new udp::socket(IO, udp::endpoint(udp::v4(), PORT))) {}
    ~Server() { delete sock; }
    void Listen() {
        sock->receive_from(boost::asio::buffer(rbuf), rmtEP, 0, err);
        if(err && err != boost::asio::error::message_size)
            throw boost::system::system_error(err);
        
        sock->send_to(boost::asio::buffer("POLO"), rmtEP, 0, ierr);
    }

};


int main() {
    boost::asio::io_service io;
    boost::system::error_code MyErr;
    
    Server Host(io, 13);

        try{
            Host.Listen();
        }catch(std::exception &e) {
            std::cerr << e.what() << std::endl;
        }
    

    return 0;
}
4

1 に答える 1

1

以下であってはならない

クライアント Me(io,"127.0.0.1","MARCO");

なれ

Client Me(io,"127.0.0.1","DAYTIME");

msg をqueryに渡しているため、その引数は、送信するメッセージではなく、実際にはサービス名である必要があります。

ブースト昼間のチュートリアルからも見ることができます

udp::resolver::query query(udp::v4(), argv[1], "daytime");
于 2013-10-28T21:01:08.360 に答える