gpt4 book ai didi

c++ - boost 异步服务器类 : Debug Assertion Failed and Empty Buffer

转载 作者:行者123 更新时间:2023-11-28 07:19:35 25 4
gpt4 key购买 nike

找不到此程序失败的原因。这一定是我的 boost 用法。问题在评论中突出显示,并且有关于一些函数调用的小注释

/* Includes Hidden */
using boost::asio::ip::udp;


class UDP_Server {

public:
UDP_Server(boost::asio::io_service& IO, unsigned short PORT)
: sock(IO, udp::endpoint(udp::v4(),PORT)) {
Listen();
}
~UDP_Server() {
for(auto& endpoint : Clients) {
delete endpoint;
}
Clients.clear();
}


void Listen() {
//waits for msg to be sent. Captures end point and sends address
//so server can store connections

udp::endpoint* T = new udp::endpoint;
sock.async_receive_from(
boost::asio::buffer(rbuf),*T,
boost::bind(&UDP_Server::handle_rec, this, T,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}

void handle_rec(udp::endpoint* EP, const boost::system::error_code& err, size_t len) {
//When the program enters here, err is 234 (windows error for more data available)
//len is 0 and rbuf is empty.

if(err && err != boost::asio::error::message_size) {
std::cerr << err.message() << std::endl;
}

std::cout.write(rbuf.data(),rbuf.size());

bool ThisClient = false;
std::string Msg = "";

for( auto& EPs : Clients) {

if(EPs == EP) {
ThisClient = true; break;
}
}

if(!ThisClient) {
if(len > 0 && rbuf[0]=='0') {
Clients.push_back(EP);
Msg = "Connected";
}else{
Msg = "Connection Refused";
}
}else{
if(rbuf[0]=='0') {
delete EP;
Clients.remove(EP);
Msg = "Disconnected";
}
}
//queue message to send back and call handle_snd function
sock.async_send_to(boost::asio::buffer(Msg),*EP,
boost::bind(&UDP_Server::handle_snd,this,EP,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred
));

Listen(); //listen for some more messages!
} //debugging through the first time through this function eventually exits here
//and ends up going through a bunch of code I didn't write, and ultimately fail.

void handle_snd(udp::endpoint *Dest, const boost::system::error_code& err, size_t len) {

}

private:
udp::socket sock;
std::list<udp::endpoint*> Clients;
std::vector<char> rbuf;
};

void HostStart() {
try {
boost::asio::io_service io;
UDP_Server Host(io,13);
io.run();
}catch(std::exception& e) {
std::cerr << e.what() << std::endl;
}
}

int main() {


std::thread thd(HostStart); //start server

try {
boost::asio::io_service io2;
udp::resolver res(io2);
udp::resolver::query queer(udp::v4(),"127.0.0.1","daytime");
udp::endpoint HostEP = *res.resolve(queer);
udp::socket sock(io2);
sock.open(udp::v4());


std::string Msg = "0";
std::vector<char> MsgArray(Msg.begin(),Msg.end());

sock.send_to(boost::asio::buffer(Msg),HostEP);

io2.run();
udp::endpoint RecEP;
std::array<char,128> rbuf;

sock.receive_from(boost::asio::buffer(rbuf),RecEP);
std::cout.write(rbuf.data(),rbuf.size());

sock.send_to(boost::asio::buffer(Msg),HostEP);
sock.receive_from(boost::asio::buffer(rbuf),RecEP);
std::cout.write(rbuf.data(),rbuf.size());

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

Sleep(10000);
return 0;
}

如果我使用调试并遍历这段代码,我发现我最终会进入一个名为win_iocp_io_service.ipp我得到这个错误: Error

在我的主要任务中,我只是尝试同步发送几条消息来测试异步服务器类。我不知道为什么异步服务器调用后缓冲区为空,也不知道为什么会出现此错误。

可能这与我何时在我的 io 服务上调用 run 以及我尝试对其进行多线程处理的方式有关。

谢谢

最佳答案

这可能是程序调用未定义行为的结果。在 UDP_Server::handle_rec() 中,调用 udp::socket::async_send_to()违反了提供给缓冲区的底层内存在调用处理程序之前必须保持有效的要求。

Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

为了满足这个标准,考虑让 Msg 成为 UDP_Server 的数据成员,而不是一个自动变量。

此外,还有两点需要考虑:

  • UDP_Server::rbuf 将始终保持零大小,导致 udp::socket::async_receive_from()UDP_Server::Listen() 什么都不读,因为没有可以读取数据的内存。 udp::socket::async_receive_from()只修改作为缓冲区提供给它的内存块的内容;调用者有责任分配内存块。将 rbuf 的大小调整到足以处理所有传入数据报的大小,或者 lazily allocate缓冲区。
  • main() 中,rbuf.size() 将始终返回 128,无论实际接收到多少数据。 udp::socket::receive_from()的返回值指示接收到的字节数,创建 boost::asio::buffer 和写入 std::cout 时应使用该值。

关于c++ - boost 异步服务器类 : Debug Assertion Failed and Empty Buffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19696796/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com