Esempio n. 1
0
CNetworkConnection::CNetworkConnection(QObject* parent)
    :QTcpSocket(parent)
{
	static bool bMetaRegistered = false;
	if( !bMetaRegistered )
	{
		qRegisterMetaType<QAbstractSocket::SocketError>("QAbstractSocket::SocketError");
		qRegisterMetaType<QAbstractSocket::SocketState>("QAbstractSocket::SocketState");
		bMetaRegistered = true;
	}

    //qDebug() << "CNetworkConnection constructor";

    m_pSocket = 0;

    m_pInput = 0;
    m_pOutput = 0;
	m_nInputSize = 8 * 1024;

    m_bInitiated = false;
    m_bConnected = false;
    m_tConnected = 0;
    m_tLastRotate = time(0);

    m_nTotalInput = m_nTotalOutput = 0;

    memset(&m_nInput, 0, sizeof(m_nInput));
    memset(&m_nOutput, 0, sizeof(m_nOutput));

	connect(this, SIGNAL(readyRead()), this, SIGNAL(readyToTransfer()), Qt::QueuedConnection);
    connect(this, SIGNAL(connected()), this, SIGNAL(readyToTransfer()));
	connect(this, SIGNAL(aboutToClose()), this, SLOT(OnAboutToClose()));
}
// Constructs an unconnected PeerWire client and starts the connect timer.
PeerWireClient::PeerWireClient(const QByteArray &peerId, QObject *parent)
    : QTcpSocket(parent), pendingBlockSizes(0),
      pwState(ChokingPeer | ChokedByPeer), receivedHandShake(false), gotPeerId(false),
      sentHandShake(false), nextPacketLength(-1), pendingRequestTimer(0), invalidateTimeout(false),
      keepAliveTimer(0), torrentPeer(0)
{
    memset(uploadSpeedData, 0, sizeof(uploadSpeedData));
    memset(downloadSpeedData, 0, sizeof(downloadSpeedData));

    transferSpeedTimer = startTimer(RateControlTimerDelay);
    timeoutTimer = startTimer(ConnectTimeout);
    peerIdString = peerId;

    connect(this, SIGNAL(readyRead()), this, SIGNAL(readyToTransfer()));
    connect(this, SIGNAL(connected()), this, SIGNAL(readyToTransfer()));

    connect(&socket, SIGNAL(connected()),
            this, SIGNAL(connected()));
    connect(&socket, SIGNAL(readyRead()),
            this, SIGNAL(readyRead()));
    connect(&socket, SIGNAL(disconnected()),
            this, SIGNAL(disconnected()));
    connect(&socket, SIGNAL(error(QAbstractSocket::SocketError)),
            this, SIGNAL(error(QAbstractSocket::SocketError)));
    connect(&socket, SIGNAL(bytesWritten(qint64)),
            this, SIGNAL(bytesWritten(qint64)));
    connect(&socket, SIGNAL(stateChanged(QAbstractSocket::SocketState)),
            this, SLOT(socketStateChanged(QAbstractSocket::SocketState)));

}
Esempio n. 3
0
void CG2Node::FlushSendQueue(bool bFullFlush)
{
    QByteArray* pOutput = GetOutputBuffer();

	while( bytesToWrite() == 0 && m_lSendQueue.size() )
	{
		while( pOutput->size() < 4096 && m_lSendQueue.size() )
		{
			G2Packet* pPacket = m_lSendQueue.dequeue();
			pPacket->ToBuffer(pOutput);
			pPacket->Release();
		}
		emit readyToTransfer();
	}


    if( bFullFlush )
    {
        if( m_bCompressedOutput && pOutput->size() )
            m_bOutputPending = true;
    }

    if( pOutput->size() )
        emit readyToTransfer();
}
void CNetworkConnection::initializeSocket()
{
	m_pSocket->disconnect();

	connect(m_pSocket, SIGNAL(connected()),
			this, SIGNAL(connected()));
	connect(m_pSocket, SIGNAL(connected()),
			this, SIGNAL(readyToTransfer()));
	connect(m_pSocket, SIGNAL(readyRead()),
			this, SIGNAL(readyToTransfer()));
	connect(m_pSocket, SIGNAL(disconnected()),
			this, SIGNAL(disconnected()));
	connect(m_pSocket, SIGNAL(error(QAbstractSocket::SocketError)),
			this, SIGNAL(error(QAbstractSocket::SocketError)));
	connect(m_pSocket, SIGNAL(bytesWritten(qint64)),
			this, SIGNAL(bytesWritten(qint64)));
	connect(m_pSocket, SIGNAL(stateChanged(QAbstractSocket::SocketState)),
			this, SIGNAL(stateChanged(QAbstractSocket::SocketState)));
	connect(m_pSocket, SIGNAL(aboutToClose()),
			this, SLOT(OnAboutToClose()));

	connect(this, SIGNAL(connected()), this, SLOT(OnConnect()), Qt::QueuedConnection);
	connect(this, SIGNAL(disconnected()), this, SLOT(OnDisconnect()), Qt::QueuedConnection);
	connect(this, SIGNAL(readyRead()), this, SLOT(OnRead()), Qt::QueuedConnection);
	connect(this, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(OnError(QAbstractSocket::SocketError)), Qt::QueuedConnection);
	connect(this, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(OnStateChange(QAbstractSocket::SocketState)), Qt::QueuedConnection);
}
// Sends a block to the peer.
void PeerWireClient::sendBlock(int piece, int offset, const QByteArray &data)
{
    QByteArray block;

    char message[] = {0, 0, 0, 1, 7};
    toNetworkData(9 + data.size(), &message[0]);
    block += QByteArray(message, sizeof(message));

    char numbers[4 * 2];
    toNetworkData(piece, &numbers[0]);
    toNetworkData(offset, &numbers[4]);
    block += QByteArray(numbers, sizeof(numbers));
    block += data;

    BlockInfo blockInfo;
    blockInfo.pieceIndex = piece;
    blockInfo.offset = offset;
    blockInfo.length = data.size();
    blockInfo.block = block;

    pendingBlocks << blockInfo;
    pendingBlockSizes += block.size();

    if (pendingBlockSizes > 32 * 16384) {
        chokePeer();
        unchokePeer();
        return;
    }
    emit readyToTransfer();
}
Esempio n. 6
0
void RateController::addSocket(PeerWireClient *socket)
{
    connect(socket, SIGNAL(readyToTransfer()), this, SLOT(scheduleTransfer()));
    socket->setReadBufferSize(downLimit * 4);
    sockets << socket;
    scheduleTransfer();
}
void CNetworkConnection::AcceptFrom(int nHandle)
{
	Q_ASSERT(m_pSocket == 0);
	m_pSocket = new QTcpSocket();

	initializeSocket();

	m_bInitiated = false;
	m_bConnected = true;
	m_tConnected = time(0);

	Q_ASSERT(m_pInput == 0);
	Q_ASSERT(m_pOutput == 0);
	m_pInput = new CBuffer(8192);
	m_pOutput = new CBuffer(8192);

	m_pSocket->setSocketDescriptor(nHandle);
	if( m_pSocket->peerAddress().protocol() == 0 )
	{
		m_oAddress.setAddress(m_pSocket->peerAddress().toIPv4Address());
	}
	else
	{
		m_oAddress.setAddress(m_pSocket->peerAddress().toIPv6Address());
	}
	m_oAddress.setPort(m_pSocket->peerPort());

	emit readyToTransfer();

}
qint64 PeerWireClient::writeData(const char *data, qint64 size)
{
    int oldSize = outgoingBuffer.size();
    outgoingBuffer.resize(oldSize + size);
    memcpy(outgoingBuffer.data() + oldSize, data, size);
    emit readyToTransfer();
    return size;
}
void CChatSessionG2::SendPacket(G2Packet *pPacket, bool bRelease)
{
	qDebug() << "Sending packet" << pPacket->GetType();
	pPacket->ToBuffer(GetOutputBuffer());
	if(bRelease)
		pPacket->Release();
	emit readyToTransfer();
}
void CRateController::AddSocket(CNetworkConnection* pSock)
{
    connect(pSock, SIGNAL(readyToTransfer()), this, SLOT(sheduleTransfer()));
    pSock->setReadBufferSize(8192);
    m_lSockets.insert(pSock);

    QMetaObject::invokeMethod(this, "sheduleTransfer", Qt::QueuedConnection);
}
Esempio n. 11
0
qint64 CNetworkConnection::writeData(const char* data, qint64 len)
{
    Q_ASSERT(m_pOutput != 0);

    int nOldSize = m_pOutput->size();
    m_pOutput->resize(nOldSize + len);
    memcpy(m_pOutput->data() + nOldSize, data, len);
    emit readyToTransfer();
    return len;
}
Esempio n. 12
0
void RateController::removeSocket(PeerWireClient *socket)
{
    disconnect(socket, SIGNAL(readyToTransfer()), this, SLOT(scheduleTransfer()));
    socket->setReadBufferSize(0);
    sockets.remove(socket);
}
void CRateController::RemoveSocket(CNetworkConnection* pSock)
{
    disconnect(pSock, SIGNAL(readyToTransfer()), this, SLOT(sheduleTransfer()));
    pSock->setReadBufferSize(0);
    m_lSockets.remove(pSock);
}