QT编程中使用Winsocket recv函数循环接收数据如何做到?

新手上路,请多包涵

用QT做一个简易聊天界面

定义了一个rec函数,用来循环接收数据

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);
        }
    }

}

在连接按钮的槽函数和发送按钮的槽函数定义里分别调用rec函数,想法是在连接后和发送后开始接收数据,但是这样做有无限循环好像程序就不能跑了。

void MainWindow::on_connect_bt_clicked()
{
    ::WSAStartup(w, &data1);                    //初始化套接字库
    s = ::socket(AF_INET, SOCK_STREAM, 0);            //创建TCP套接字
    addr.sin_family = AF_INET;                //初始化地址结构
    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("正在尝试连接服务器!!!\n\n"));
    ui.display_text->moveCursor(QTextCursor::End);//将光标定位到末尾
    if (::connect(s, (sockaddr*)&addr, sizeof(addr))==0)
    {
        QString Str_notice = QStringLiteral( "已成功连接到主机" )+ 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地址与端口号,也有可能是网络原因或其他未知错误"));
        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("}已发出") + "\n";
        ui.display_text->insertPlainText(str_message);
        ui.display_text->moveCursor(QTextCursor::End);

    }
    else if(status == 0)
    {
        ui.display_text->insertPlainText(QStringLiteral("未发送任何数据!!\n"));
        ui.display_text->moveCursor(QTextCursor::End);
    }
    else if (status < 0)
    {
        ui.display_text->insertPlainText(QStringLiteral("Error:发生未知错误!\n"));
        ui.display_text->moveCursor(QTextCursor::End);
    }
    rec();
}
阅读 4.4k
1 个回答
✓ 已被采纳新手上路,请多包涵

两天才通过审核……,自己找到了解决方法,之前刚开始学习qt,使用多线程就可以解决了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题