账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    QT编程中使用Winsocket recv函数循环接收数据如何做到?
    31
    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();
    }
    0
    打赏
    收藏
    点击回答
        全部回答
    • 共 0 条
    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部