Search code examples
csocketswinapiwinsocknetstat

Why is my socket's open port not listed by netstat?


If you run this example, you'll see the port is never listed by netstat. Why? And how do I make it so?

#include <WinSock.h>
#include <io.h>
#include <stdio.h>

#pragma comment(lib, "WS2_32")

int main() {
    WORD wVers = MAKEWORD(2, 2);
    WSADATA wsa;
    WSAStartup(wVers, &wsa);
    SOCKET sock = socket(AF_INET, SOCK_STREAM, 6);
    if (sock != INVALID_SOCKET) {
        struct sockaddr_in addr = { 0 };
        addr.sin_family = AF_INET;
        addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
        int addrlen = sizeof(addr);
        bind(sock, (struct sockaddr *)&addr, addrlen);
        if (getsockname(sock, (struct sockaddr *)&addr, &addrlen) == 0) {
            fprintf(stdout, "HANDLE = %d, port = %d\n", sock, addr.sin_port);
            fflush(stdout);
            system("netstat -a -n");
        }
        closesocket(sock);
    }
    WSACleanup();
}

Solution

  • netstat -a only lists connected sockets and listening socket.

      -a            Displays all connections and listening ports.
    

    Neither connect nor listen was called on your socket, so it falls outside the purview of netstat -a.

    However, since Windows 10, you can use netstat -q.

      -q            Displays all connections, listening ports, and bound