c++ - 每次迭代后更新帧

标签 c++ qt sockets port port-scanning

我目前正在用 Qt(C++) 为 Mac 编写一个端口扫描器。检查某个端口是否打开的过程完全正常。 但是如果用户要检查的端口范围太大,每个端口都会检查,但只有在这个过程之后才会输出。 该程序实际上应该检查例如端口 1 并输出结果。之后它应该检查下一个和输出等等...

void MainWindow::checkPort(int portmin, int portmax, string ip) {
int dif = portmax - portmin;
if (dif <= 0)
    return;

unsigned int open = 0;
unsigned int closed = 0;
int checked = 0;

sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(ip.c_str());

for (int i = portmin; i <= portmax; i++) {
    int s = socket(AF_INET, SOCK_STREAM, 0);
    addr.sin_port = htons(i);

    int con = ::connect(s, reinterpret_cast<sockaddr*>(&addr), sizeof(sockaddr));

    if (con == 0){
        ui->textEdit->setTextColor(Qt::green);
        ui->textEdit->append("Port " + QString::number(i) + " open.");
        open++;
    }

    if (con == -1) {
        ui->textEdit->setTextColor(Qt::red);
        ui->textEdit->append("Port " + QString::number(i) + " closed.");
        closed++;
    }

    ::close(con);
    ::close(s);
    checked++;
}

您是否建议我如何每次迭代后输出

最佳答案

也许是这样的:

//...
bool tooManyPorts = dif > 10000; // Set flag to true if port range is too big (for example more than 10 000 ports
// 
QString msgs = "";
for (int i = portmin; i <= portmax; i++) {
    int s = socket(AF_INET, SOCK_STREAM, 0);
    addr.sin_port = htons(i);

    if (con == 0){
        if (tooManyPorts) {
            QString("<font color='green'>Port " + QString::number(i) + " open.</font><br/>");
        }
        else {
            ui->textEdit->setTextColor(Qt::green);
            ui->textEdit->append("Port " + QString::number(i) + " open.");
        }
        open++;
    }

    if (con == -1) {
        if (tooManyPorts) {
            msgs += QString("<font color='red'>Port " + QString::number(i) + " closed.</font><br/>");
        }
        else {
            ui->textEdit->setTextColor(Qt::red);
            ui->textEdit->append("Port " + QString::number(i) + " closed.");
        }
        closed++;
    }
    // ...
}
if(tooManyPorts) {
    ui->textEdit->append(msgs); // Add all iteration messages to text edit
}

请注意格式化部分使用 HTML。

这会在循环后将所有输出添加到您的字段中。要让它在每次迭代中都起作用,只需在循环中设置 msgs = ... 而不是 msgs += ... ,然后移动 if(tooManyPorts ) ... 在你的 for 的末尾,但不在外面。坦率地说,我很难理解您是否不想要第一个版本(在循环之后),因为现在您正在在每个迭代步骤中将输出添加到文本字段。

关于c++ - 每次迭代后更新帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39469180/

相关文章:

c++ - 非标准扩展链接错误CMake

c++ - 使用 IXMLHTTPRequest2 流式传输时如何在 Windows 8 上禁用缓存?

QT - QGridLayout 需要不同的标题行间距

c++ - 来自子程序的 QT QMainWindow

sockets - 不允许两个套接字使用同一个端口吗?

php - Websockets,并识别独特的同行[PHP]

c++ - 基数树 (Patricia Trie) 是一种高效的手机通讯录数据结构吗

python - 有没有办法将按键重新分配给 Qt 中的不同功能?

java - 将服务器与客户端 java 套接字同步

c++ - 在 C++ 中取消引用指向结构的指针