是否有Windows API可以确定哪个给定端口在某个IP地址上关闭/正在使用(我的方案的localhost)?
我尝试了以下内容:
SOCKADDR_IN saddr;
saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
WSADATA WSA = {0};
if (WSAStartup(MAKEWORD(2, 0), &WSA) == 0) {
SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
if (s != SOCKET_ERROR) {
saddr.sin_port = htons(Port); // `Port` evaluates to any given number 1 - 65535
if (bind(s, (SOCKADDR *) &saddr, sizeof(SOCKADDR_IN)) == SOCKET_ERROR) {
if (GetLastError() != 0) {
DWORD a = GetLastError(); // WSAGetLastError() points to this anyways, so whatever
a = 0; // breakpoint here
}
}
}
}
closesocket(s);
即使我检查已经由给定进程使用的端口,例如XAMPP在我的方案中使用的MYSQL (3306)
。它仍然没有为SOCKET_ERROR
返回bind
。
我做错了什么?
答案 0 :(得分:0)
即使另一个套接字绑定到接口,bind()调用也不一定会失败:套接字可能没有绑定SO_EXCLUSIVEADDR选项。当绑定到之前被另一个套接字绑定的特定接口(例如某个端口上的loopback / 127.0.0.1)时,你基本上会劫持接口并从那里接收所有前往它的数据包。请参阅提供的MSDN链接中的此表以获取行为的详细映射(仅当第一个bind()指向特定接口时,才应用Specific2):
为了确定哪些应用程序绑定到哪个界面,您可以查看Finding tcp ports used by application。