0

別のスレッドで実行されているこのサーバーは、頻繁にスローされる例外「accept: Already open exception」を除いて、一見うまく機能しているように見えます。この例外は、acceptor.accept(...) 呼び出しで、ソケットが既に開いているかどうかをチェックしてスローされます。ソケットが開いていない場合 (コメント行)、accepter.accept(...) を呼び出すと、動作が予測不能になります。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;
};
4

1 に答える 1

3

Asio 用語では、有効なソケット ハンドル (記述子) がある場合、ソケットは「開いている」と見なされます。着信接続を受け入れるときは、アクセプタに「新しい」開いていないソケットを渡す必要があります。したがって、問題はコードのロジックにあります。最初にクライアントからの新しい接続を受け入れる必要があります。次に、受け入れたソケットを使用して、必要なデータを送受信できます。

于 2012-05-24T12:05:29.990 に答える