【发布时间】:2014-02-09 21:14:04
【问题描述】:
在我的 winsock 应用程序中,我在某个端口上调用 bind。我现在正在测试,所以应用程序经常崩溃并且没有达到所有套接字都关闭的点。当我下次运行应用程序时,我在 bind 调用时收到 10048 错误。
因此,我决定通过 tcp 连接表并终止所有使用我的端口的进程(从我之前的运行中,但我在任务管理器中看不到它们)。我尝试了 GetTcpTable、GetTcpTable2、GetExtendedTcpTable,但它们都没有提供 netstat -ano 的功能。我的端口号和 id 出现在 netstat -ano 输出中,但不在任何这些函数检索到的 tcp 表中。
如何以编程方式获取 netstat -ano 数据。 setsockopt 具有可重复使用的地址不是一种方法,因为如果我连接而不是接受“丢失的进程”将被调用。请帮忙。
addrinfo hints, *result;
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
//... get ip and so on
getaddrinfo(ip, DEFAULT_PORT, &hints, &result);
sock = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
bind(sock, result->ai_addr, (int)result->ai_addrlen); // here is error 10048
另一个进程已经在侦听 DEFAULT_PORT(该进程可能仍在我之前的程序测试中运行,但是我在任务管理器中看不到它),这就是出现错误 10048 的原因。
这里是找到这个过程的代码:
void TerminateProcOnPort2(const char* port_str)
{
int size = 0;
if(ERROR_INSUFFICIENT_BUFFER == GetTcpTable2(NULL, (ULONG*)&size, false))
{
MIB_TCPTABLE2* pids = (MIB_TCPTABLE2*)malloc(size);
if(NO_ERROR == GetTcpTable2(pids, (ULONG*)&size, false))
{
MIB_TCPROW2* owner;
UINT port = atoi(port_str);
for(UINT i = 0; i < pids->dwNumEntries; ++i)
{
owner = &pids->table[i];
if(owner->dwLocalPort == port)
{
printf("GOOD\n");
// now we can kill this process by id...
}
}
}
else PrintError("GetTcpTable 2 error");
}
else PrintError("GetTcpTable 1 error");
}
我的端口不在检索到的表中,但是 netstat -ano 看到了它。帮助。
【问题讨论】:
-
没有代码,我们无法判断您尝试了什么。
-
发现了这篇文章,其中 C# 应用程序使用 GetExtendedTcpTable 的包装器来获取包括 PID 在内的信息。文章下方还有下载互操作包装器代码的链接,其中显示了传递给 GetExtendedTcpTable 的参数。 timvw.be/2007/09/09/build-your-own-netstatexe-with-c