別のスレッドで実行されているこのサーバーは、頻繁にスローされる例外「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;
};