2
프로세스의 모든 소켓 파일 설명자 목록을 검색하려면 어떻게합니까? 파이썬에서이 작업을 수행 할 수 있습니까? 아니면 C에서 Winsock을 사용해야합니까?Winsock을 사용하여 소켓 목록 가져 오기
프로세스의 모든 소켓 파일 설명자 목록을 검색하려면 어떻게합니까? 파이썬에서이 작업을 수행 할 수 있습니까? 아니면 C에서 Winsock을 사용해야합니까?Winsock을 사용하여 소켓 목록 가져 오기
저는 파이썬을 모르지만 다음 코드는 쉽게 이식 가능하다고 생각합니다.
저는 VxWorks에서 다음과 같은 방법을 자주 사용했으며 Windows에서 작동하는지 테스트하기 위해 Windows에서 자주 시도했습니다.
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;
}
: 내가하는 다음과 같은 테스트 응용 프로그램과 윈도우 7에서 실행 한
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! */
}
}
일부 소켓을 생성한다 : 그들은 유효한지 아이디어는 간단하게 (= 정수) 소켓을 반복하고 확인하는 것입니다 나는 다음과 같은 출력물을 얻을 :
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
흥미롭게도, 윈도우 socket(..)
에 의해 반환 된 소켓 당 두 개의 추가 소켓을 생성하는 것 같다. 나는 이것에 대한 약간의 정보를 찾기 위해 잠깐 인터넷을 검색했지만 아무 것도 찾지 못했습니다 ...
위대한 답변이지만 왜 중재 답장을 1024로합니까? 그것이 소켓의 최대 수입니까? – user4257726
@ user4257726 응용 프로그램의 최대 소켓 수를 정의하는 FD_SETSIZE (기본값은 64라고 생각합니다)라는 상수가 있습니다. 그러나 Windows는 오프셋이있는 소켓을 만들기 시작합니다. 그래서 나는 무작위로 모든 소켓을 얻기 위해 많은 수의 FD_SETSIZE를 선택했습니다 ... –
BUt이 방법으로 소켓 중 일부를 놓칠 수 없습니까? MAX_INT까지 올라갈 필요가 없습니까? – user4257726