如何摆脱接受:已经在boost :: asio服务器中打开异常

时间:2012-05-23 22:33:28

标签: boost boost-asio

这个服务器在一个单独的线程中运行,除了频繁抛出的异常“accept:已经打开的异常”外,似乎运行良好。在检查套接字是否已打开时,会在acceptor.accept(...)调用上抛出此异常。如果我调用accepter.accept(...)iff套接字未打开(注释行),则行为变得不可预测。 run方法从同步的mQueue获取数据,该mQueue以每秒约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;
};

1 个答案:

答案 0 :(得分:2)

在asio术语中,如果套接字具有有效的套接字句柄(描述符),则它是“打开的”。当您接受传入连接时,应该向接受者传递一个“新的”未打开的套接字。 因此,问题在于代码的逻辑:您应首先接受来自客户端的新连接,然后您可以使用接受的套接字发送/接收您想要的任何数据。