LINUX.ORG.RU

qt4, локальный сокет.


0

0

есть прогамма на qt4. есть сокет, точнее его файловый дескриптор. 

нужно повесить сигнал на появление данных в сокете.

вот так не работает:
QAbstractSocket *qFD = new QAbstractSocket(QAbstractSocket::UnknownSocketType,this);                                                                         
qFD->QAbstractSocket::setSocketDescriptor(asyncFd);                                                                                                          
connect(qFD,SIGNAL( readyRead () ), this, SLOT( ProcessData()) ); 



anonymous

С сокетами можно работать и без qt. Открываешь сокет и при каждом чтении из него делаешь emit socketLive(); А к socketLive() коннектишь необходимые слоты.

Или же я что-то не понял...

staseg ★★★★★
()

class Connection : public QTcpSocket
{
    Q_OBJECT

public:

    Connection(QObject *parent = 0);
	~Connection();
	
private slots:
    void processReadyRead();

};

Connection::Connection(QObject *parent)
    : QTcpSocket(parent)
{
	QObject::connect(this, SIGNAL(readyRead()), this, SLOT(processReadyRead()));
}

Connection::~Connection()
{
	this->deleteLater();
}

void Connection::processReadyRead()
{
		char *szData;
		QStringList clCommand; 

		QByteArray block = NULL;
		QDataStream out(&block, QIODevice::WriteOnly);
		out.setVersion(QDataStream::Qt_4_0);

		if( this->isReadable())
		{
			qint64 qnSize = this->bytesAvailable();
			if( qnSize > 0)
			{
				szData = new char [qnSize+sizeof(szData)];
				qint64 qnReadSize = this->read(szData, qnSize);
				szData[qnReadSize] = NULL;
			}
		}

		QString cQuestion(szData);
		delete[] szData;
                //bla bla bla
                
                block.append("Answer !!!");
		this->write(block);

}


Если на каждое соединение поток, то как то так:

Thread::Thread(int socketDescriptor,QObject *parent)
    : QThread(parent), socketDescriptor(socketDescriptor)
{
	
}

Thread::~Thread()
{
	QThread::exit();
	QThread::wait();
}

void Thread::run()
{
	Connection connection;
	if(!connection.setSocketDescriptor(socketDescriptor))
	{
		emit error(connection.error());
		return;
	}
	connect(&connection, SIGNAL(disconnected()), this, SLOT(deleteConnection()));
	exec();
}

void Thread::deleteConnection()
{
	this->deleteLater();
}


соответственно, допустим:

void Server::incomingConnection(int socketDescriptor)
{
	Thread *thread = new Thread(socketDescriptor,this);
	connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
	thread->start();	
}





Где то могу ошибаться, но общий принцип должен быть понятен.

Fastman
()
Ответ на: комментарий от Fastman

так он не tcp, а локальный. или это ничего?

anonymous
()
Ответ на: комментарий от Fastman

code more, create less (c)

вот так правильно:

QSocketNotifier *sock = new QSocketNotifier(asyncFd, QSocketNotifier::Read);

connect (sock , SIGNAL(activated (int) ), this, SLOT(tapi_fd(int)));

*топикстартер*

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.