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();
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
两天才通过审核……,自己找到了解决方法,之前刚开始学习qt,使用多线程就可以解决了。