c ++在Windows中的某个端口上侦听什么进程

时间:2010-10-28 08:24:11

标签: c++ windows visual-c++ networking

我在visual c ++中创建了一个程序,我已经实现了一个Web服务。 Web服务设置为侦听端口80,但如果另一个程序已在使用此端口,则Web服务无法启动。

所以当webservice无法启动时,我想有一个函数或方法,它可以获取当前使用端口80的进程名称。然后我可以向用户输出错误,然后问他关闭这个过程。

4 个答案:

答案 0 :(得分:3)

GetExtendedTcpTableGetExtendedUdpTable会为您提供网络连接列表。您可以浏览此列表并检查程序是否正在使用端口80(它还提供进程ID)。

答案 1 :(得分:0)

作为第一次尝试,我会考虑将netstat作为外部进程运行并捕获/解析输出。它为您提供了有效的连接。

答案 2 :(得分:0)

不确定是否有办法通过API(不是Windows程序员)执行此操作,但是您可以尝试使用netstat -abo作为shell命令,然后在结果字符串中查找TCP和端口80,并且''我将使用二进制名称......

编辑:我相信你至少需要XP SP2来实现这个目标...

答案 3 :(得分:0)

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

/**
 * \brief Find id of the process that is listening to given port.
 * \param port A port number to which a process is listening.
 * \return The found process id, or 0 if not found.
 */
uint findProcessListeningToPort(uint port)
{
   QString netstatOutput;
   {
      QProcess process;
      process.start("netstat -ano -p tcp");
      process.waitForFinished();
      netstatOutput = process.readAllStandardOutput();
   }
   QRegularExpression processFinder;
   {
      const auto pattern = QStringLiteral(R"(TCP[^:]+:%1.+LISTENING\s+(\d+))").arg(port);
      processFinder.setPattern(pattern);
   }
   const auto processInfo = processFinder.match(netstatOutput);
   if (processInfo.hasMatch())
   {
      const auto processId = processInfo.captured(1).toUInt();
      return processId;
   }
   return 0;
}