我使用原始 C++ 套接字在 Qt 中编写了一个程序。
问题是我的函数 listen(listener, 1);
阻止程序主窗口的显示,直到它通过套接字获取任何数据。如果我删除listen 函数,那么会显示该窗口。
这就是我使用的所有代码:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
int listener, sock;
struct sockaddr_in addr;
int bytes_read;
listener = socket(AF_INET, SOCK_STREAM, 0);
addr.sin_family = AF_INET;
addr.sin_port = htons(3366);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(listener, (struct sockaddr *)&addr, sizeof(addr));
listen(listener, 1);
sock = accept(listener, NULL, NULL);
char buf[1024];
bytes_read = recv(sock, buf, 1024, 0);
ui->label->setText(ui->label->text() + QString(buf));
::close(sock);
}
请帮助我在程序开始时直接显示窗口。 非常感谢!
最佳答案
您应该让您的 GUI 代码与处理设置套接字和监听连接的代码在单独的线程中运行。你想让你的用户界面线程自由地处理来自用户的输入并在必要时重绘。为此,您可以在 main() 中创建一个新的 QThread 对象来处理套接字逻辑。
请参阅有关 QThreads 的 QT 文档以了解如何执行此操作。下面是关于该主题的 SO 线程的链接。 what is the correct way to implement a QThread... (example please...)
关于c++ - 由于 Qt 中的 accept socket 函数,窗口没有出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22736252/