Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何消除accept:boost::asio服务器中已打开的异常_Boost_Boost Asio - Fatal编程技术网

如何消除accept:boost::asio服务器中已打开的异常

如何消除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

这个服务器运行在一个单独的线程中,除了频繁抛出的异常“accept:ready open exception”之外,它似乎运行得很好。在检查套接字是否已打开时,acceptor.accept(…)调用会引发此异常。如果我在套接字未打开(注释行)时调用accepter.accept(…),行为将变得不可预测。run方法从同步的MQUE获取数据,该MQUE在另一个线程上以大约每秒30次的速度填充

我做错了什么

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()修复了这一问题。谢谢。