QT Tcpクライアント送信受信併存初体験エッセイ

1805 ワード

VS2010
VS 2010の開発に慣れ、tcpクライアントリンク後、受信データの並列処理を達成するために送信スレッドと受信スレッドを習慣的に作成する
QT
送受信スレッドを作成してデータ処理を行うこともできますが、socketをポインタ方式やグローバル方式でスレッドで使用することはできません.socketDescriptor操作に依存する必要がありますが、windowsでは、ネットワークデバッグアシスタントを利用して送受信の総バイト数が一致しないことをテストします.なぜか、才疎学が浅いのか、windowsでは使用できないのか、とにかくスキップします.主な記録は信号とスロット方式でクライアント送受信を行う
QTバージョン
qt-opensource-windows-x86-msvc2010_opengl-5.4.1.exe
ヘッダファイルを含める
#include #include
ソースファイル処理
初期構築
 m_pClient = new QTcpSocket(this);
 if (m_pClient)
 {
  connect(m_pClient, SIGNAL(readyRead()), this, SLOT(recvSlot()));  //         
  connect(m_pClient, SIGNAL(bytesWritten(qint64)), this, SLOT(sendSlot(qint64)));  //   ,         ,           
 }

接続サービス
  m_pClient->abort();
 m_pClient->connectToHost(strIP, port);
 const int timeOut = 5 * 1000;
 if (!m_pClient->waitForConnected(timeOut))
 {
 
 }
 else
 { 
  
 }

じゅしんみぞかんすう
void TcpClient::recvSlot()
{
 QByteArray dat = m_pClient->readAll();
}

送信および送信スロット関数
送信関数
void TcpClient::send(const quint64& sendDatLen, const unsigned int& cnt)
{
 if (m_bConnect)
 {
  m_sendDat = increasingSequence(sendDatLen);
  m_totalBytes = sendDatLen*cnt;
  m_bytesToWrite = m_totalBytes - m_pClient->write(m_sendDat);
 }
}

QByteArray TcpClient::increasingSequence(const quint64& sendDatLen)
{
 QByteArray tmp;
 unsigned char cnt = 0x0;
 while (tmp.length() < sendDatLen)
 {
  tmp.append(cnt++);
 }
 return tmp;
}

送信スロット関数
void TcpClient::sendSlot(qint64 numBytes)
{
 m_bytesWritten += numBytes;
 if (m_bytesToWrite > 0)
 {
  m_bytesToWrite -= m_pClient->write(m_sendDat);
 }
 else
 {
  if (m_bytesWritten == m_totalBytes)
  {
  }
 }
}