0

我正在尝试使用 boost 创建一个客户端类(UDP)。我正在尝试将简短的 udp 客户端教程转换为可以处理连接的类。我对网络编程、提升或捕获错误不是很熟悉。我将不胜感激的答案

  • 为什么解析函数返回未处理的异常?和
  • 我将如何进行适当的检查以处理异常。

我发现了一个有用的 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

不应低于

客户我(io,"127.0.0.1","MARCO");

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

因为您将 msg 传递给查询,并且该参数实际上应该是服务名称而不是您要发送的消息。

您也可以从boost daytime tutorial中看到它

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