如何消除accept:boost::asio服务器中已打开的异常
这个服务器运行在一个单独的线程中,除了频繁抛出的异常“accept:ready open exception”之外,它似乎运行得很好。在检查套接字是否已打开时,acceptor.accept(…)调用会引发此异常。如果我在套接字未打开(注释行)时调用accepter.accept(…),行为将变得不可预测。run方法从同步的MQUE获取数据,该MQUE在另一个线程上以大约每秒30次的速度填充 我做错了什么如何消除accept:boost::asio服务器中已打开的异常,boost,boost-asio,Boost,Boost Asio,这个服务器运行在一个单独的线程中,除了频繁抛出的异常“accept:ready open exception”之外,它似乎运行得很好。在检查套接字是否已打开时,acceptor.accept(…)调用会引发此异常。如果我在套接字未打开(注释行)时调用accepter.accept(…),行为将变得不可预测。run方法从同步的MQUE获取数据,该MQUE在另一个线程上以大约每秒30次的速度填充 我做错了什么 class Server{ public: Server(unsigned sh
class Server{
public:
Server(unsigned short port, ConcurrentQueue<uint8_t*>*queueToServer, unsigned int width, unsigned int height):mSocket(mIOService),mAcceptor(mIOService,ip::tcp::endpoint(ip::tcp::v4(), port)),mQueue(queueToServer), dSize(width*height*3){}
void run(){
unsigned char* data;
boost::system::error_code ignored_error;
while(true){
if (mQueue->try_pop(data)){
const mutable_buffer image_buffer(data, dSize);
//if (!mSocket.is_open())
mAcceptor.accept(mSocket);
boost::asio::write(mSocket, buffer(image_buffer), transfer_all(), ignored_error);
}
}
}
private:
io_service mIOService;
ip::tcp::socket mSocket;
ip::tcp::acceptor mAcceptor;
ConcurrentQueue<uint8_t*>* mQueue;
std::size_t dSize;
};
类服务器{
公众:
服务器(无符号短端口,ConcurrentQueue*queueToServer,无符号整数宽度,无符号整数高度):mSocket(mIOService),mAcceptor(mIOService,ip::tcp::endpoint(ip::tcp::v4(),port)),MQUE(queueToServer),dSize(宽度*高度*3){}
无效运行(){
无符号字符*数据;
boost::system::error\u代码被忽略\u错误;
while(true){
如果(mQueue->try_pop(数据)){
常量可变缓冲区图像缓冲区(数据,dSize);
//如果(!mSocket.is_open())
mAcceptor.accept(mSocket);
boost::asio::write(mSocket,buffer(image\u buffer),transfer\u all(),忽略\u错误);
}
}
}
私人:
io_服务和MIO服务;
ip::tcp::socket mSocket;
ip::tcp::接受器mAcceptor;
ConcurrentQueue*MQUE;
标准:大小;
};
在asio术语中,如果套接字具有有效的套接字句柄(描述符),则它是“打开的”。当您接受传入连接时,应该向接受者传递一个“新的”未打开的套接字。
因此,问题在于代码的逻辑:您应该首先接受来自客户端的新连接,然后可以使用接受的套接字发送/接收所需的任何数据。R:对,我通过在write调用后调用mSocket.close()修复了这一问题。谢谢。