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