检查正在使用的端口

时间:2017-10-06 00:01:02

标签: c winsock port-scanning

是否有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

我做错了什么?

1 个答案:

答案 0 :(得分:0)

即使另一个套接字绑定到接口,bind()调用也不一定会失败:套接字可能没有绑定SO_EXCLUSIVEADDR选项。当绑定到之前被另一个套接字绑定的特定接口(例如某个端口上的loopback / 127.0.0.1)时,你基本上会劫持接口并从那里接收所有前往它的数据包。请参阅提供的MSDN链接中的此表以获取行为的详细映射(仅当第一个bind()指向特定接口时,才应用Specific2):

Specific2 only applies if the first bind() was to a specific interface

为了确定哪些应用程序绑定到哪个界面,您可以查看Finding tcp ports used by application