我试图让 IPC 在一台服务器之间工作,以接受来自 Qt 4.6 的多个客户端的请求。一切正常,除了底层命名管道没有被关闭,使 Qt 发出最大句柄到达消息 (62)。
由于我想接受多个客户端连接,因此我将 newConnections 处理到 QLocalServer 类,如下所示:
void ServerImpl::onNewConnection()
{
QLocalSocket * plsocket = _server->nextPendingConnection();
SocketHandler* skh = new SocketHandler(plsocket, this, this);
connect(plsocket, SIGNAL(readyRead()), skh, SLOT(socketReadyRead()));
connect(plsocket, SIGNAL(error(QLocalSocket::LocalSocketError)), skh,
SLOT(onError(QLocalSocket::LocalSocketError)));
connect(plsocket, SIGNAL(disconnected()), skh, SLOT(disconnected()));
}
由于每次获得新连接时,从 QLocalServer::nextPendingConnection() 接收到的 QLocalSocket 指针都会被覆盖,因此我通过 SocketHandler 类管理数据请求,该类当然封装了一个 QLocalSocket 类:
void SocketHandler::socketReadyRead()
{
QDataStream in(_ps);
in.setVersion(QDataStream::Qt_4_5);
forever
{
if (_blocksize == 0)
{
if (_ps->bytesAvailable() < sizeof(blocksize_t))
return;
in >> _blocksize;
}
// We need more data?
if (_ps->bytesAvailable() < _blocksize)
return;
_srv->ReadRequest(in);
// CHECK: Discard remaining blocks
_blocksize = 0;
}
}
这是类声明:
class SocketHandler : public QObject
{
Q_OBJECT
public:
SocketHandler(QLocalSocket* ps, ServerImpl* srv, QObject* parent = 0) :
QObject(parent), _ps(ps), _blocksize(0), _srv(srv) { };
virtual ~SocketHandler() {};
public slots:
void socketReadyRead();
void onError(QLocalSocket::LocalSocketError);
void disconnected();
private:
QLocalSocket* _ps;
blocksize_t _blocksize;
ServerImpl* _srv;
};
如上所述,问题是我无法在客户端请求时断开与服务器的连接。我试过 QLocalSocket::close, QLocalSocket::disconnectFromServer 没有运气。
我应该使用多线程解决方案吗?(我认为它不会解决问题)。
我正在考虑的另一个解决方案是提供 1:1 QLocalServer<-->QLocalSocket IPC 机制,而不是尝试处理 1:N。
提前致谢。