⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 senderthread.cpp

📁 用qt4 编写的局域网聊天工具
💻 CPP
字号:
/*************************************************************************** *   Copyright (C) 2007 by Anistratov Oleg                                 * *   ower@users.sourceforge.net                                            * *                                                                         * *   This program is free software; you can redistribute it and/or modify  * *   it under the terms of the GNU General Public License version 2        * *   as published by the Free Software Foundation;                         * *                                                                         * *   This program is distributed in the hope that it will be useful,       * *   but WITHOUT ANY WARRANTY; without even the implied warranty of        * *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         * *   GNU General Public License for more details.                          * *                                                                         * ***************************************************************************/#include <assert.h>#include "senderthread.h"#include "globals.h"#include "abstractchatcore.h"SenderThread::SenderThread(QObject *parent) : QThread         (parent),  m_socket         (NULL),  m_udp            (NULL),  m_tcp            (NULL),  m_port           (61100),  m_datagrams      (NULL),  m_datagramsNum   (0),  m_datagramsMaxNum(0),  m_timer          (NULL){  m_buffer = (char*)malloc(65535);  assert(NULL != m_buffer);  moveToThread(this);}//\*****************************************************************************SenderThread::~SenderThread(){  qDebug("[~SenderThread]");  delete m_socket;  free(m_buffer);}//\*****************************************************************************void SenderThread::run(){  // TODO stop timer when $m_datagramsNum == 0 and start it when new task added..  // TODO ..or create timer for every datagram(maybe include it in LargeDatagramOut)  m_udp = new QUdpSocket(this);  m_socket = m_udp;  m_timer    = new QTimer(this);  m_timer->setInterval(10);  m_timer->start();  connect(m_timer, SIGNAL(timeout()), this, SLOT(sending()));  exec();}//\*****************************************************************************void SenderThread::addTask(char* header, quint16 header_len, char* data, quint32 data_len, quint64 dest_uid, quint32 id){  Q_ASSERT(currentThread() == this);  qDebug("[SenderThread::addTask]: ID = %u", id);  LargeDatagramOut** tmp;  LargeDatagramOut*  dtgrm = new LargeDatagramOut(this);  QHostAddress addr = QHostAddress(dest_uid);  dtgrm->moveToThread(this);  if(dtgrm)  {    dtgrm->init(header, header_len, data, data_len, dest_uid, id);    connect(dtgrm, SIGNAL(wantDie(LargeDatagramOut*)), this, SLOT(deleteDatagram(LargeDatagramOut*)));    qDebug("[SenderThread::addTask]: adding(%lu)", (unsigned long)id);    m_datagramsNum++;    if(m_datagramsMaxNum < m_datagramsNum)    {      m_datagramsMaxNum++;      tmp = (LargeDatagramOut**)realloc(m_datagrams, m_datagramsMaxNum * sizeof(LargeDatagramOut*));      if(!tmp)        delete dtgrm;      else      {        m_datagrams = tmp;        m_datagrams[m_datagramsNum - 1] = dtgrm;      }    }    else      m_datagrams[m_datagramsNum - 1] = dtgrm;  }}//\*****************************************************************************void SenderThread::addFileTask(char* header, quint16 header_len, const QString & filename, quint64 dest_uid, quint32 id){  Q_ASSERT(currentThread() == this);  LargeDatagramOut** tmp;  LargeDatagramOut*  dtgrm = new LargeDatagramOut(this);  dtgrm->moveToThread(this);  if(dtgrm)  {    connect(dtgrm, SIGNAL(wantDie(LargeDatagramOut*)), this, SLOT  (deleteDatagram(LargeDatagramOut*)));    connect(dtgrm, SIGNAL(sendingCancelled(quint16 )), this, SIGNAL(sendingCancelled(quint16        )));    dtgrm->init(header, header_len, filename, dest_uid, id);    qDebug("[SenderThread::addFileTask]: adding(%lu)", (unsigned long)id);    m_datagramsNum++;    if(m_datagramsMaxNum < m_datagramsNum)    {      m_datagramsMaxNum++;      tmp = (LargeDatagramOut**)realloc(m_datagrams, m_datagramsMaxNum * sizeof(LargeDatagramOut*));      if(!tmp)        delete dtgrm;      else      {        m_datagrams = tmp;        m_datagrams[m_datagramsNum - 1] = dtgrm;      }    }    else      m_datagrams[m_datagramsNum - 1] = dtgrm;  }}//\*******s**********************************************************************quint32 SenderThread::getValidID() const{  for(quint32 i = 1; i > 0; i++)    if(!containID(i))      return i;  return 0;}//\*****************************************************************************bool SenderThread::containID(quint32 ID) const{  quint32 i;  for(i = 0; i < m_datagramsNum; i++)    if(m_datagrams[i]->id() == ID)      return true;  return false;}//\*****************************************************************************void SenderThread::deleteDatagram(LargeDatagramOut* dtgrm){  Q_ASSERT(currentThread() == this);  for(quint32 i = 0; i < m_datagramsNum; i++)    if(dtgrm == m_datagrams[i])    {      emit sendingFinished(dtgrm->id());      m_datagrams[i] = m_datagrams[m_datagramsNum - 1];      m_datagramsNum--;      delete dtgrm;      break;    }}//\*****************************************************************************void SenderThread::slot_fragmentsRequest(char* dtgrm_, quint32 dtgrm_len){  qDebug("[SenderThread::slot_fragmentsRequest]");  quint16 ID              = AbstractChatCore::packetId(dtgrm_);  LargeDatagramOut* dtgrm = findDatagram(ID);  if(dtgrm)    dtgrm->fragmentsRequest(dtgrm_, dtgrm_len);}//\*****************************************************************************LargeDatagramOut* SenderThread::findDatagram(quint16 ID) const{  for(quint32 i = 0; i < m_datagramsNum; i++)    if(m_datagrams[i]->id() == ID)      return m_datagrams[i];  return NULL;}//\*****************************************************************************void SenderThread::slot_acceptSending (quint16 ID){  LargeDatagramOut* dtgrm = findDatagram(ID);  if(dtgrm)    dtgrm->acceptSending();}//\*****************************************************************************void SenderThread::slot_cancelTask(quint16 id){  Q_ASSERT(currentThread() == this);  LargeDatagramOut* dtgrm = findDatagram(id);  if(dtgrm)    deleteDatagram(dtgrm);}//\*****************************************************************************int SenderThread::send(char* buf, int size, const QHostAddress& addr){  int bs = -2;  if(m_socket == m_tcp)  {    if(m_socket->state() == QAbstractSocket::ConnectedState)      bs = m_socket->write(buf, size);    m_socket->flush();  }  else if(m_socket == m_udp)    bs = m_udp->writeDatagram(buf, size, addr, m_port);  qDebug("[SenderThread::send]: dtgrm size = %d, sent = %d\n", size, bs);  return bs;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -