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

发布于 2022-09-06 20:49:29 字数 2398 浏览 11 评论 0

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

捎一片雪花 2022-09-13 20:49:29

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文