我正在尝试使用 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;
}