Get List of Sockets with Winsock

626 Views Asked by At

How can I retrieve a list of all socket file descriptors in my process? Is it possible to do this in Python or must I do this in C with Winsock?

1

There are 1 best solutions below

4
On BEST ANSWER

I don't know Python but I think the following code is easily portable.

I've used the following method on VxWorks frequently and quickly tried it on Windows to test if it works. The idea is to simply iterate sockets (= integers) and check if they are valid:

int iterator;
int len;
int option;

for (iterator = 1; iterator < 1024; iterator++)
{
    len = sizeof(option);
    if (getsockopt((SOCKET)iterator, SOL_SOCKET, SO_TYPE, &option, &len) == 0)   // valid socket?
    {
        /* valid socket found! */
    }
}

I've run it on Windows 7 with the following test application which creates some sockets:

int main ()
{
    WSADATA wsaData;
    SOCKET s;
    int iterator;
    int option;
    int len;
    struct sockaddr_in sockaddr;



    WSAStartup(MAKEWORD(2, 0), &wsaData);


    /*
    **  create some sockets...
    */
    s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    printf("s=%d\n", s);

    s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    printf("s=%d\n", s);
    sockaddr.sin_family = AF_INET;
    sockaddr.sin_addr.s_addr = inet_addr("192.168.178.1");
    sockaddr.sin_port = htons(80);
    connect(s, (SOCKADDR *)&sockaddr, sizeof(sockaddr));

    s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    printf("s=%d\n", s);
    sockaddr.sin_family = AF_INET;
    sockaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    sockaddr.sin_port = htons(27015);
    bind(s, (SOCKADDR *)&sockaddr, sizeof(sockaddr));
    listen(s, 10);



    printf("\niterating sockets...\n");
    for (iterator = 1; iterator < 1024; iterator++)
    {
        len = sizeof(option);
        if (getsockopt((SOCKET)iterator, SOL_SOCKET, SO_TYPE, &option, &len) == 0)   // valid socket?
        {
            printf("socket=%d (type=%d)\n", iterator, option);

            len = sizeof(option);
            if (getsockopt((SOCKET)iterator, SOL_SOCKET, SO_ACCEPTCONN, &option, &len) == 0)
            {
                if (option == 0)
                {
                    len = sizeof(sockaddr);
                    if (getpeername((SOCKET)iterator, (SOCKADDR *)&sockaddr, &len) == 0)
                    {
                        printf("   connected to %d.%d.%d.%d:%d\n",
                               sockaddr.sin_addr.S_un.S_un_b.s_b1,
                               sockaddr.sin_addr.S_un.S_un_b.s_b2,
                               sockaddr.sin_addr.S_un.S_un_b.s_b3,
                               sockaddr.sin_addr.S_un.S_un_b.s_b4,
                               sockaddr.sin_port);
                    }
                    else
                    {
                        printf("   ???\n");
                    }
                }
                else
                {
                    len = sizeof(sockaddr);
                    if (getsockname((SOCKET)iterator, (SOCKADDR *)&sockaddr, &len) == 0)
                    {
                        printf("   accepting connections on port=%d\n", sockaddr.sin_port);
                    }
                    else
                    {
                        printf("   accepting connections on port=???\n");
                    }
                }
            }
        }
    }

    return 0;
}

I get the following printouts:

s=124
s=132
s=136

iterating sockets...
socket=124 (type=1)
   ???
socket=125 (type=1)
   ???
socket=126 (type=1)
   ???
socket=132 (type=1)
   connected to 192.168.178.1:20480
socket=133 (type=1)
   connected to 192.168.178.1:20480
socket=134 (type=1)
   connected to 192.168.178.1:20480
socket=136 (type=1)
   accepting connections on port=34665
socket=137 (type=1)
   accepting connections on port=34665
socket=138 (type=1)
   accepting connections on port=34665

Interestingly, it seems that Windows creates two additional sockets per socket returned by socket(..). I briefly searched the internet to find some information about this but didn't find anything...