Python 使用Winsock获取套接字列表

Python 使用Winsock获取套接字列表,python,c,windows,winsock2,Python,C,Windows,Winsock2,如何检索进程中所有套接字文件描述符的列表? 是否可以在Python中执行此操作,或者我必须使用Winsock在C中执行此操作?我不懂Python,但我认为以下代码很容易移植 我经常在VxWorks上使用以下方法,并在Windows上快速试用,以测试其是否有效。其思想是简单地迭代套接字(=整数)并检查它们是否有效: int iterator; int len; int option; for (iterator = 1; iterator < 1024; iterator++) {

如何检索进程中所有套接字文件描述符的列表?
是否可以在Python中执行此操作,或者我必须使用Winsock在C中执行此操作?

我不懂Python,但我认为以下代码很容易移植

我经常在VxWorks上使用以下方法,并在Windows上快速试用,以测试其是否有效。其思想是简单地迭代套接字(=整数)并检查它们是否有效:

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! */
    }
}

有趣的是,Windows似乎为
socket(…)
返回的每个套接字创建了两个额外的套接字。我在互联网上搜索了一些关于这方面的信息,但没有找到任何东西…

答案很好,但为什么你会随意停在1024?这是套接字的最大数量吗?@user4257726有一个名为FD_SETSIZE(=默认为64)的常量,它定义了应用程序的最大套接字数量。但是Windows开始创建带有偏移量的套接字。所以我只是随机选择了一个大的数字(关于FD_SETSIZE)来获得所有的套接字…但是这样你不可能错过一些套接字吗?你不需要到MAX_INT去确认你得到了所有的值吗?@user4257726你是对的,确保你必须检查每一个可能的值。但是看看FD_SETSIZE(它相当小)和接近100的偏移量,如果停止在10000处迭代,则处于保存状态。还请记住,每个套接字也需要一些内存(用于I/O缓冲区…),因此您永远不会得到2^32个套接字。。。
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;
}
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