识别进程正在特定端口C/C++Windows中运行

Identify process is running in certain port C/C++ Windows

本文关键字:C++Windows 运行 进程 识别      更新时间:2023-10-16

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

#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 errorn", ps);
    }
}
int main()
{
    char result[1024];
    executeCMD( "netstat -ano", result);
    printf("%s", result );
    return 0;
}

也许,你可以试一试!

我有一个在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+).+LISTENINGs+(?<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; 
}