c++ - 由于 Qt 中的 accept socket 函数,窗口没有出现

标签 c++ qt sockets

我使用原始 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/

相关文章:

qt - 如何创建特定于发行版的条件 qmake 项目

java - 让 PrintWriter 在 Servlet 执行后工作 - 当serversocket接受连接时由套接字客户端调用

c++ - 在类类内不必要使用枚举类

.net - C++ 是否转换为 MSIL?

c++ - 模拟本地网络添加新计算机

c++ - "This application has requested the Runtime to terminate it in an unusual way."

c++ - -1.#IND的含义

c++ - 写入未初始化的变量 : undefined behaviour?

c# - 二进制格式化程序从内存流卡住中反序列化

java - 是否可以在同一台机器上运行套接字服务器和套接字客户端?