我在visual c ++中创建了一个程序,我已经实现了一个Web服务。 Web服务设置为侦听端口80,但如果另一个程序已在使用此端口,则Web服务无法启动。
所以当webservice无法启动时,我想有一个函数或方法,它可以获取当前使用端口80的进程名称。然后我可以向用户输出错误,然后问他关闭这个过程。
答案 0 :(得分:3)
GetExtendedTcpTable和GetExtendedUdpTable会为您提供网络连接列表。您可以浏览此列表并检查程序是否正在使用端口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;
}