在我的winsock应用程序中,我在某个端口上调用 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可以看到它。帮助
答案 0 :(得分:1)
解决方案是对从ntohs()
检索到的所有数字使用GetTcpTable
Windows函数,以获得与netstat相同的输出,例如ntohs(owner->dwLocalPort)
。