1

私はLinuxマシンとWindowsマシンを持っています。C++プログラムウィッチがLinuxマシンのサーバーとして機能し、QtアプリケーションウィッチがWindowsマシンのクライアントとして機能します。ソケットを暗号化キーとして使用します(基本的なxor暗号化)

問題は、接続を複数回ヒットすると、偽の文字列が表示されることです。問題はqtアプリケーションにあると思います。ここに私のコードがあります。ユーザーが接続ボタンを何度も押すのを防ぐために、グローバルフラグをビジーにしようとしましたが、このフラグがトリガーされることはありません。

なんで?ミューテックスを使用する必要がありますか?はいの場合、どのように?

void MainWindow::performRead()
{
    QTcpSocket * sock = static_cast<QTcpSocket*>(this->sender());
    if (key == 0)
    {
    busy = true;
    QString recv(sock->readLine());
    key = recv.toInt();
    qDebug() << "Cheia este " << key;

    char * response = enc_dec("#AUTH|admin|admin",strlen("#AUTH|admin|admin"),key);
    sock->write(response);
    }
    else
    {
        busy = true;
        while (sock->bytesAvailable() > 0)
        {  
        unsigned short word;
        sock->read((char*)(&word),2);
        qDebug()<<word;
        QByteArray bts = sock->read(word);
        char * decodat = enc_dec((char*)bts.data(),bts.length() - 2,key);
        char testx[2];
        sock->peek(&testx[0],2);
        qDebug() << decodat;
        }
    }

    busy = false;
}

void MainWindow::on_pushButton_clicked()
{
    if (!busy)
    {
    key = 0;
    QTcpSocket * sock = new QTcpSocket();
    connect(sock,SIGNAL(readyRead()),this,SLOT(performRead()));
    sock->connectToHost("194.110.212.46",6550);
    }
    else qDebug()<<"Can't you see I am busy??" << endl;
}

char * enc_dec(char * str,int len, int key)
{
    unsigned char keys[2];
    keys[0] = (unsigned char)key;
    keys[1] = keys[0] ^ 255;
    char * nou = new char[len + 1];
    nou[len] = '\0';
    for (int i = 0; i < len; i++)
    {
        char tmpy = str[i] ^ keys[i % 2];
        nou[i] = tmpy;
    }
    return nou;
}
4

1 に答える 1

2

あなたのコードはかなりめちゃくちゃです、ここに私の提案があります:

  • ボタンを押すたびにソケットを使用しないでくださいconnect- 以前のものを上書きし、不必要な作業を行います - TCP 接続の確立にはコストがかかります。
  • おそらく、「接続」ボタンと「切断」ボタンがあり、接続が確立されたときにのみソケットからの読み取りを許可します。
  • 最初に「暗号化」なしですべてが機能することを確認してください。
  • その後、実際の暗号化を使用します。
于 2012-09-25T14:43:16.333 に答える