鍍金池/ 問答/Python  C++/ QT編程中使用Winsocket recv函數(shù)循環(huán)接收數(shù)據(jù)如何做到?

QT編程中使用Winsocket recv函數(shù)循環(huán)接收數(shù)據(jù)如何做到?

用QT做一個(gè)簡易聊天界面

定義了一個(gè)rec函數(shù),用來循環(huán)接收數(shù)據(jù)

void MainWindow::rec()
{
    while(true)
        {
        //ui.display_text->insertPlainText("ok");
        if (::recv(s, sztext, sizeof(sztext), 0)>0)
        {
            QString str_message_2 = QStringLiteral("對方說>>") + QString(QLatin1String(sztext)) + "\n";
            ui.display_text->insertPlainText(str_message_2);
        }
    }

}

在連接按鈕的槽函數(shù)和發(fā)送按鈕的槽函數(shù)定義里分別調(diào)用rec函數(shù),想法是在連接后和發(fā)送后開始接收數(shù)據(jù),但是這樣做有無限循環(huán)好像程序就不能跑了。

void MainWindow::on_connect_bt_clicked()
{
    ::WSAStartup(w, &data1);                    //初始化套接字庫
    s = ::socket(AF_INET, SOCK_STREAM, 0);            //創(chuàng)建TCP套接字
    addr.sin_family = AF_INET;                //初始化地址結(jié)構(gòu)
    bool ok;
    addr.sin_port = htons(ui.Port_Edit->text().toInt(&ok,10));
    
    
    addr.sin_addr.S_un.S_addr = inet_addr(ui.IP_addr_Edit->text().toStdString().data());
    ui.display_text->insertPlainText(QStringLiteral("正在嘗試連接服務(wù)器?。?!\n\n"));
    ui.display_text->moveCursor(QTextCursor::End);//將光標(biāo)定位到末尾
    if (::connect(s, (sockaddr*)&addr, sizeof(addr))==0)
    {
        QString Str_notice = QStringLiteral( "已成功連接到主機(jī)" )+ ui.IP_addr_Edit->text()+"\n\n";
        ui.display_text->insertPlainText(Str_notice);
        ui.display_text->moveCursor(QTextCursor::End);
        rec();
    }
    else
    {
        ui.display_text->insertPlainText(QStringLiteral("連接失?。?!請檢查輸入的IP地址與端口號,也有可能是網(wǎng)絡(luò)原因或其他未知錯(cuò)誤"));
        ui.display_text->moveCursor(QTextCursor::End);
    }
    
}



void MainWindow::on_send_bt_clicked()
{    
    int status = ::send(s, ui.message_Edit->text().toStdString().data(), sizeof(ui.message_Edit->text().toStdString().data()), 0);
    if (status > 0)
    {
        QString str_message = QStringLiteral("消息{") + ui.message_Edit->text() + QStringLiteral("}已發(fā)出") + "\n";
        ui.display_text->insertPlainText(str_message);
        ui.display_text->moveCursor(QTextCursor::End);

    }
    else if(status == 0)
    {
        ui.display_text->insertPlainText(QStringLiteral("未發(fā)送任何數(shù)據(jù)!!\n"));
        ui.display_text->moveCursor(QTextCursor::End);
    }
    else if (status < 0)
    {
        ui.display_text->insertPlainText(QStringLiteral("Error:發(fā)生未知錯(cuò)誤!\n"));
        ui.display_text->moveCursor(QTextCursor::End);
    }
    rec();
}
回答
編輯回答
尋仙

兩天才通過審核……,自己找到了解決方法,之前剛開始學(xué)習(xí)qt,使用多線程就可以解決了。

2017年9月28日 10:46