Пример #1
0
Worker::Worker(QIODevice* peer, QObject* parent)
	: QObject(parent),
	  m_peer(peer), m_target(0), m_connector(0),
	  m_buf(), m_expected_length(-1), m_state(Worker::ConnectedState),
	  m_noauth_allowed(false)
{
	QObject::connect(this->m_peer, SIGNAL(readyRead()), this, SLOT(peerReadyReadHandler()));

	if (qobject_cast<QAbstractSocket*>(this->m_peer)) {
		QObject::connect(this->m_peer, SIGNAL(disconnected()), this, SLOT(disconnectHandler()));
		QObject::connect(this->m_peer, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(peerErrorHandler(QAbstractSocket::SocketError)));
	}
	else {
		QObject::connect(this->m_peer, SIGNAL(aboutToClose()), this, SLOT(disconnectHandler()));
	}
}
Пример #2
0
void Worker::targetConnectedHandler(void)
{
	this->m_target = new QTcpSocket(this);
	this->m_connector->assignTo(this->m_target);
	delete this->m_connector;
	this->m_connector = 0;

	union {
		quint32 v4;
		Q_IPV6ADDR v6;
		quint16 port;
		char ptr;
	} data;

	QByteArray response("\x05\x00\x00", 3);
	QHostAddress a;
	if (qobject_cast<QAbstractSocket*>(this->m_peer)) {
		a = (qobject_cast<QAbstractSocket*>(this->m_peer))->peerAddress();
	}

	if (a.protocol() == QAbstractSocket::IPv4Protocol) {
		response.append('\x01');
		data.v4 = qToBigEndian(a.toIPv4Address());
		response.append(QByteArray::fromRawData(&data.ptr, sizeof(data.v4)));
	}
	else if (a.protocol() == QAbstractSocket::IPv6Protocol) {
		response.append('\x04');
		data.v6 = a.toIPv6Address();
		response.append(QByteArray::fromRawData(&data.ptr, sizeof(data.v6)));
	}
	else {
		Q_ASSERT(false);
	}

	if (qobject_cast<QAbstractSocket*>(this->m_peer)) {
		data.port = qToBigEndian<quint16>((qobject_cast<QAbstractSocket*>(this->m_peer))->peerPort());
	}
	else {
		data.port = 0;
	}

	response.append(QByteArray::fromRawData(&data.ptr, sizeof(data.port)));

	QObject::connect(this->m_target, SIGNAL(readyRead()), this, SLOT(targetReadyReadHandler()));
	QObject::connect(this->m_target, SIGNAL(disconnected()), this, SLOT(disconnectHandler()));

	if (this->writeAndFlush(this->m_peer, response) == response.size()) {
		this->m_state = Worker::ConnectionProxiedState;
	}
	else {
		if (this->m_peer) {
			this->m_peer->close();
		}

		this->m_state = Worker::FatalErrorState;
	}
}
Пример #3
0
void readMessage(char *buffer, int sock) //parse the commands read
{
    int readStatus;
    zeroBuffer(buffer);
    readStatus = read(sock, buffer, MAX_MESSAGE_SIZE);
        
    printf("command read: %d\n", (int)buffer[COMMAND_LOCATION]);
    
    switch ((int)buffer[COMMAND_LOCATION]) 
    {
        case PORT:
            portHandler(buffer, sock);
            break;
            
        case USERNAME:
            usernameHandler(buffer, sock);
            break;
            
        case DISCONNECT:
            disconnectHandler(buffer, sock);
            break;
            
        case LIST_USERS:
            listHandler(buffer, sock);
            break;
            
        case MESSAGE:
            messageUserHandler(buffer, sock);
            break;
            
        default:
            printf("\nCommand not supported: (%d)\n", buffer[COMMAND_LOCATION]);
            writeMessageDefined(sock, buffer);
            break;
    }
    
    if (readStatus < 0)
    {
        error("ERROR reading from socket");
    }
    else
    {
        if(!chop(buffer)) //remove any unwanted characters
        {            
            memset(buffer, 0, MAX_MESSAGE_SIZE);
            buffer = TIMEOUT_CALL;
        }
    }
}