Здравствуйте. Необходимо реализовать работу с сетью по протоколу UDP на Qt 3.
Программа должна соединяться с многими устройствами, у каждого устройства есть основной и резервный канал. Для этого написан класс NetInterface, содержащий два сокета для основного и для резервного канала.
Когда создан один сокет(setPrimaryChannel или setSecondaryChannel), работают и передача и прием.
Если создать оба сокета, то сокеты работают только на передачу - сигнал activated при получении данных не возникает.
Выяснилось, что дело именно в сокетах - достаточно добавить в метод setPrimaryChannel строку
C++ (Qt)
QSocketDevice* s=new QSocketDevice;
чтобы перестал работать прием.
Если сокеты не находятся в одном классе-наследнике QObject, то они успешно работают вместе.
Во всех примерах к Qt3 в классе только один сокет.
Является ли это каким-то известным багом Qt 3, и как его обходить?
C++ (Qt)
class NetInterface : public QObject
{
Q_OBJECT
public:
NetInterface();
~NetInterface();
void setPrimaryChannel(QHostAddress addr, int port);
void setSecondaryChannel(QHostAddress addr, int port);
void sendPacket(const char* packet, int size);
private:
QSocketDevice *pSocket, *sSocket;
QSocketNotifier *pNotifier, *sNotifier;
QHostAddress pAddr, sAddr;
int pPort, sPort;
private slots:
void pDataReceived(int);
void sDataReceived(int);
};
void NetInterface::setPrimaryChannel(QHostAddress addr, int port)
{
pAddr=addr;
pPort=port;
pSocket=new QSocketDevice(QSocketDevice::Datagram);
pSocket->setBlocking(false);
pSocket->bind(addr, port);
pNotifier = new QSocketNotifier(pSocket->socket(), QSocketNotifier::Read);
connect(pNotifier, SIGNAL(activated(int)), SLOT(pDataReceived(int)));
}
void NetInterface::setSecondaryChannel(QHostAddress addr, int port)
{
sAddr=addr;
sPort=port;
sSocket=new QSocketDevice(QSocketDevice::Datagram);
sSocket->setBlocking(false);
sSocket->bind(addr, port);
sNotifier = new QSocketNotifier(sSocket->socket(), QSocketNotifier::Read);
connect(sNotifier, SIGNAL(activated(int)), SLOT(sDataReceived(int)));
}