QObject::connect: No such slot QObject::dataReceiv
Publicado por Pedro (1 intervención) el 06/07/2009 09:47:26
Estoy intentando hacer una aplicación utilizando QSocketNotifier para detectar llegada de sockets. La aplicación compila bien, pero al arrancar dice:
QObject::connect: No such slot QObject::dataReceived()
QObject::connect: (sender name: 'unnamed')
QObject::connect: (receiver name: 'unnamed')
No se porque dice no such slot porque se supone que está definido. ¿Qué tengo mal?. El código es el siguiente:
//SocketParser.h
#ifndef SOCKETPARSER_H_
#define SOCKETPARSER_H_
#include <sys/types.h>
#include <qobject.h>
#define BUFFERSIZE 1024
class socket_parser:QObject
{
public:
void launchServer(int port1, int port2 = 0);
static int parse(const char buffer[BUFFERSIZE]);
static void send_PlayerDone(const char *idPlayer);
static void send_Alive();
public slots:
virtual void dataReceived();
private:
static char* getAttributeString(const char *buffer, char *attrName);
static int getAttributeValue(const char *buffer, char *attrName);
static bool getAttributeBoolean(const char *buffer, char *attrName);
public:
static struct sockaddr_in remote;
static unsigned int inputPort;
static unsigned int outputPort;
private:
static int serversock;
};
#endif /*SOCKETPARSER_H_*/
SocketParser.cpp
#include "SocketParser.h"
#include "manager.h"
//#include <string.h>
#include <netdb.h> // hostent struct, gethostbyname()
#include <arpa/inet.h> // inet_ntoa() to format IP address
#include <netinet/in.h> // in_addr structure
#include <errno.h> // error handling
#include <iostream> // cout and endl functions
#include <iostream> // cout and endl functions
#include <stdio.h>
#include "string.h"
#include "stdlib.h"
//#include <qobject.h>
#include <qsocketnotifier.h>
#define AM_DBG
#ifndef AM_DBG
#define AM_DBG if(0)
#endif
#define MAXPENDING 5 // Max connection requests
#define DEFAULT_PORT 1234
int socket_parser::serversock = 0;
struct sockaddr_in socket_parser::remote = {0, 0, {0}, {"0"}};
unsigned int socket_parser::inputPort = 0;
unsigned int socket_parser::outputPort = 0;
void socket_parser::dataReceived(){
fprintf(stdout, "DATA!!! ");
char buffer[BUFFERSIZE];
int received = 1;
socklen_t len = sizeof(socket_parser::remote);
// Clear buffer data
memset(buffer, 0, BUFFERSIZE);
// Receive message
if ((received = recvfrom(socket_parser::serversock, buffer, BUFFERSIZE, 0,
(struct sockaddr *)&socket_parser::remote, &len)) < 0) {
std::cerr << "Failed to receive bytes from client. Error(" << errno << "): " << strerror(errno) <<std::endl;
return;
}
else
socket_parser::parse(buffer);
}
int socket_parser::parse(const char buffer[BUFFERSIZE])
{
// Parse string
printf("SOCKET RECIBIDO!!!!!!!"); fflush(stdout);
}
//LLAMADO POR EL MAIN DE LA APPL
void socket_parser::launchServer(int port1, int port2) {
struct sockaddr_in echoserver;
if (port1 <=0)
socket_parser::inputPort = DEFAULT_PORT;
else
socket_parser::inputPort = port1;
if (port2 <=0)
socket_parser::outputPort = socket_parser::inputPort;
else
socket_parser::outputPort = port2;
// Create the TCP socket
if ((socket_parser::serversock = socket(PF_INET, SOCK_DGRAM, 0)) < 0) {
perror("Failed to create socket"); exit(1);
}
// Construct the server sockaddr_in structure
memset(&echoserver, 0, sizeof(echoserver)); // Clear struct
echoserver.sin_family = AF_INET; // Internet/IP
echoserver.sin_addr.s_addr = htonl(INADDR_ANY); // Incoming addr
echoserver.sin_port = htons(inputPort); // server port
// Bind the server socket
if (bind(socket_parser::serversock, (struct sockaddr *) &echoserver,
sizeof(echoserver)) < 0) {
perror("Failed to bind the server socket"); exit(1);
}
QSocketNotifier *sn = new QSocketNotifier(socket_parser::serversock, QSocketNotifier::Read);
this->connect( sn, SIGNAL(activated(int)),this, SLOT(dataReceived()) );
fprintf(stdout, "adviewer_qt: Waiting for clients... ");
while (true){
sleep(1000);
}
fprintf(stdout, "Closing server... ");
close(socket_parser::serversock);
}
QObject::connect: No such slot QObject::dataReceived()
QObject::connect: (sender name: 'unnamed')
QObject::connect: (receiver name: 'unnamed')
No se porque dice no such slot porque se supone que está definido. ¿Qué tengo mal?. El código es el siguiente:
//SocketParser.h
#ifndef SOCKETPARSER_H_
#define SOCKETPARSER_H_
#include <sys/types.h>
#include <qobject.h>
#define BUFFERSIZE 1024
class socket_parser:QObject
{
public:
void launchServer(int port1, int port2 = 0);
static int parse(const char buffer[BUFFERSIZE]);
static void send_PlayerDone(const char *idPlayer);
static void send_Alive();
public slots:
virtual void dataReceived();
private:
static char* getAttributeString(const char *buffer, char *attrName);
static int getAttributeValue(const char *buffer, char *attrName);
static bool getAttributeBoolean(const char *buffer, char *attrName);
public:
static struct sockaddr_in remote;
static unsigned int inputPort;
static unsigned int outputPort;
private:
static int serversock;
};
#endif /*SOCKETPARSER_H_*/
SocketParser.cpp
#include "SocketParser.h"
#include "manager.h"
//#include <string.h>
#include <netdb.h> // hostent struct, gethostbyname()
#include <arpa/inet.h> // inet_ntoa() to format IP address
#include <netinet/in.h> // in_addr structure
#include <errno.h> // error handling
#include <iostream> // cout and endl functions
#include <iostream> // cout and endl functions
#include <stdio.h>
#include "string.h"
#include "stdlib.h"
//#include <qobject.h>
#include <qsocketnotifier.h>
#define AM_DBG
#ifndef AM_DBG
#define AM_DBG if(0)
#endif
#define MAXPENDING 5 // Max connection requests
#define DEFAULT_PORT 1234
int socket_parser::serversock = 0;
struct sockaddr_in socket_parser::remote = {0, 0, {0}, {"0"}};
unsigned int socket_parser::inputPort = 0;
unsigned int socket_parser::outputPort = 0;
void socket_parser::dataReceived(){
fprintf(stdout, "DATA!!! ");
char buffer[BUFFERSIZE];
int received = 1;
socklen_t len = sizeof(socket_parser::remote);
// Clear buffer data
memset(buffer, 0, BUFFERSIZE);
// Receive message
if ((received = recvfrom(socket_parser::serversock, buffer, BUFFERSIZE, 0,
(struct sockaddr *)&socket_parser::remote, &len)) < 0) {
std::cerr << "Failed to receive bytes from client. Error(" << errno << "): " << strerror(errno) <<std::endl;
return;
}
else
socket_parser::parse(buffer);
}
int socket_parser::parse(const char buffer[BUFFERSIZE])
{
// Parse string
printf("SOCKET RECIBIDO!!!!!!!"); fflush(stdout);
}
//LLAMADO POR EL MAIN DE LA APPL
void socket_parser::launchServer(int port1, int port2) {
struct sockaddr_in echoserver;
if (port1 <=0)
socket_parser::inputPort = DEFAULT_PORT;
else
socket_parser::inputPort = port1;
if (port2 <=0)
socket_parser::outputPort = socket_parser::inputPort;
else
socket_parser::outputPort = port2;
// Create the TCP socket
if ((socket_parser::serversock = socket(PF_INET, SOCK_DGRAM, 0)) < 0) {
perror("Failed to create socket"); exit(1);
}
// Construct the server sockaddr_in structure
memset(&echoserver, 0, sizeof(echoserver)); // Clear struct
echoserver.sin_family = AF_INET; // Internet/IP
echoserver.sin_addr.s_addr = htonl(INADDR_ANY); // Incoming addr
echoserver.sin_port = htons(inputPort); // server port
// Bind the server socket
if (bind(socket_parser::serversock, (struct sockaddr *) &echoserver,
sizeof(echoserver)) < 0) {
perror("Failed to bind the server socket"); exit(1);
}
QSocketNotifier *sn = new QSocketNotifier(socket_parser::serversock, QSocketNotifier::Read);
this->connect( sn, SIGNAL(activated(int)),this, SLOT(dataReceived()) );
fprintf(stdout, "adviewer_qt: Waiting for clients... ");
while (true){
sleep(1000);
}
fprintf(stdout, "Closing server... ");
close(socket_parser::serversock);
}
Valora esta pregunta


0