【问题标题】:Identify process is running in certain port C/C++ Windows [closed]识别进程正在某些端口 C/C++ Windows 中运行 [关闭]
【发布时间】:2014-04-26 17:58:19
【问题描述】:

谁能告诉我如何使用 C/C++ 识别在 Windows 的某个端口中运行的进程。我想写一个简单的端口扫描器。当我发现一些端口打开时,我还想打印每个端口中正在运行的进程。 谢谢。

【问题讨论】:

  • 我真心希望这是不可能的。
  • 为什么不可能?
  • 如果可以获取进程,可能会有很多安全问题
  • 主要问题是您是要扫描本地端口还是远程端口,因此是要扫描本地进程还是远程进程。

标签: c++ c windows networking network-programming


【解决方案1】:
#include <stdio.h>
#include <string>

void executeCMD(const char *cmd, char *result)
{
    char buf_ps[1024];
    char ps[1024]={0};
    FILE *ptr;
    strcpy(ps, cmd);
    if((ptr=popen(ps, "r"))!=NULL)
    {
        while(fgets(buf_ps, 1024, ptr)!=NULL)
        {
            strcat(result, buf_ps);
            if(strlen(result)>1024)
                break;
        }
        pclose(ptr);
        ptr = NULL;
    }
    else
    {
        printf("popen %s error\n", ps);
    }
}

int main()
{
    char result[1024];
    executeCMD( "netstat -ano", result);
    printf("%s", result );
    return 0;
}

也许,你可以试一试!

【讨论】:

  • 非常感谢。我会试试的。
  • 这是一种非常糟糕的做法。调用外部进程,好吧,这比使用 API 简单多了。但是缓冲区处理很糟糕。
【解决方案2】:

我有一个在 C++ 中使用 Qt 的解决方案:

/**
 * \brief Find all ids of processes that is listening to any port.
 * \return A key-value map that keys are ports and values are corresponding process id.
 */
QMap<uint, uint> findAllProcessesListeningToAnyPort()
{
   QMap<uint, uint> portToProcessId;
   QString netstatOutput;
   {
      QProcess process;
      process.start("netstat -ano -p tcp");
      process.waitForFinished();
      netstatOutput = process.readAllStandardOutput();
   }
   QRegularExpression processFinder;
   {
      const auto pattern = R"(TCP[^:]+:(?<port>\d+).+LISTENING\s+(?<pid>\d+))";
      processFinder.setPattern(pattern);
   }
   auto processInfoItr = processFinder.globalMatch(netstatOutput);
   while (processInfoItr.hasNext())
   {
      const auto processInfo = processInfoItr.next();
      const auto port = processInfo.captured("port").toUInt();
      const auto processId = processInfo.captured("pid").toUInt();
      portToProcessId.insert(port, processId);
   }
   return portToProcessId; 
}

【讨论】:

    最近更新 更多