作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
#include "string"
#include <boost/asio.hpp>
#include <boost/asio/io_context.hpp>
using namespace boost::asio::ip;
class A {
public:
std::string address;
std::string port;
boost::asio::io_context io_context;
udp::socket socketInstance = udp::socket(io_context);
udp::endpoint endpointSetup;
explicit A(std::string addrs, std::string port) {
this->address = addrs;
this->port = port;
}
A(const A& a) {
this->address = a.address;
this->port = a.port;
}
void attachListener() {
endpointSetup = udp::endpoint(make_address(address), std::stoi(port));
socketInstance = udp::socket(io_context, endpointSetup);
}
};
class B {
public:
A aClass;
explicit B(const A& a) : aClass(a) {}
void getData() {
std::array<char, 1024> recv_buffer{};
aClass.socketInstance.receive_from(boost::asio::buffer(recv_buffer), aClass.endpointSetup);
}
};
int main() {
A a("192.168.1.49", "5080");
a.attachListener();
B b(a);
b.getData();
}
零件
aClass.socketInstance.receive_from(boost::asio::buffer(recv_buffer), aClass.endpointSetup);
创建错误
Bad file descriptor
.
io_context
房产在
class A
不知何故被摧毁。基本上,我想要实现的是在单独的类中监听某些 UDP 端口。我该如何解决这个问题?
最佳答案
问题在于您对 aClass
的声明成员(member)在 B
:
class B {
public:
A aClass;
explicit B(const A& a) : aClass(a) {}
...
aClass
成员的类型是
A
,所以当你做
aClass(a)
,执行复制。您已经为
A
定义了一个复制构造函数。 ,但它不会复制已经打开的套接字,在拷贝中留下一个默认初始化(因此未打开)的套接字。
class C {
public:
std::string foo_ = "foo";
C(const std::string &foo) : foo_{foo} {}
C(const C &c) {}
};
如果您要运行以下代码:
C c{"bar"};
C c2{c};
std::cout << c2.foo_ << std::endl;
你会得到输出
foo
.这是因为
C
的复制构造函数不复制
foo_
成员。因此,当
c2
被初始化,它不会取值
bar
来自
c
,而是默认初始化
foo_
加入
foo
.同样的问题适用于您的
A
的套接字成员类(class)。
B
避免复制持有指向
A
的指针:
class B {
public:
A* aClass;
explicit B(A* a) : aClass(a) {}
void getData() {
std::array<char, 1024> recv_buffer{};
aClass->socketInstance.receive_from(boost::asio::buffer(recv_buffer),
aClass->endpointSetup);
}
};
然后在
main
做:
B b(&a);
这样,当您创建
B
时,它仍然可以访问您为原始
A
初始化的套接字.
A*
,您也可以使用智能指针,即
std::unique_ptr<A>
或
std::shared_ptr<A>
,如果您想在
B
的意义上表达所有权拥有
A
,从而是
A
持有的套接字.
A
, 如果你想传递一个
A
至
B
还要
B
取得
A
持有的套接字的所有权实例,不使用(智能)指针的间接性。
udp::socket
的移动构造函数。 .但是,这需要您移动
io_context
出
A
,因为
io_context
没有移动构造函数。
#include <boost/asio.hpp>
#include <boost/asio/io_context.hpp>
using namespace boost::asio::ip;
class A {
public:
std::string address;
uint16_t port;
boost::asio::io_context &io_context;
udp::socket socketInstance;
udp::endpoint endpointSetup;
explicit A(boost::asio::io_context &io_context, std::string addrs,
uint16_t port)
: io_context{io_context}, address{addrs}, port{port}, socketInstance{
io_context} {}
void attachListener() {
endpointSetup = udp::endpoint{make_address(address), port};
socketInstance = udp::socket{io_context, endpointSetup};
}
};
class B {
public:
A aClass;
explicit B(A &&a) : aClass{std::move(a)} {}
void getData() {
std::array<char, 1024> recv_buffer{};
aClass.socketInstance.receive_from(boost::asio::buffer(recv_buffer),
aClass.endpointSetup);
}
};
int main() {
boost::asio::io_context io_context{};
A a{io_context, "127.0.0.1", 5080};
a.attachListener();
B b{std::move(a)};
b.getData();
}
两种解决方案都可以进行测试,例如和
netcat --udp localhost 5080
关于c++ - 在使用 boost::asio 时得到了 receive_from:错误的文件描述符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63881752/
即阻塞版本是否会在出错时返回 -1。 或者更重要的是,你怎么知道调用失败了?做 boost::asio::ip::udp::socket::receive_from() 错误时返回 -1 正常的 BS
#include "string" #include #include using namespace boost::asio::ip; class A { public: st
我有以下 ASIO 代码,它同步读取 UDP 数据包。问题是如果在给定的时间范围(30 秒)内没有给定大小的数据包到达,我希望 recieve_from 函数在特定超时时返回某种错误。 for (;;
我是一名优秀的程序员,十分优秀!