这个服务器在一个单独的线程中运行,除了频繁抛出的异常“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;
};
答案 0 :(得分:2)
在asio术语中,如果套接字具有有效的套接字句柄(描述符),则它是“打开的”。当您接受传入连接时,应该向接受者传递一个“新的”未打开的套接字。 因此,问题在于代码的逻辑:您应首先接受来自客户端的新连接,然后您可以使用接受的套接字发送/接收您想要的任何数据。