2014-11-16 2 views

답변

0

저는 파이썬을 모르지만 다음 코드는 쉽게 이식 가능하다고 생각합니다.

저는 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(..)에 의해 반환 된 소켓 당 두 개의 추가 소켓을 생성하는 것 같다. 나는 이것에 대한 약간의 정보를 찾기 위해 잠깐 인터넷을 검색했지만 아무 것도 찾지 못했습니다 ...

+0

위대한 답변이지만 왜 중재 답장을 1024로합니까? 그것이 소켓의 최대 수입니까? – user4257726

+0

@ user4257726 응용 프로그램의 최대 소켓 수를 정의하는 FD_SETSIZE (기본값은 64라고 생각합니다)라는 상수가 있습니다. 그러나 Windows는 오프셋이있는 소켓을 만들기 시작합니다. 그래서 나는 무작위로 모든 소켓을 얻기 위해 많은 수의 FD_SETSIZE를 선택했습니다 ... –

+0

BUt이 방법으로 소켓 중 일부를 놓칠 수 없습니까? MAX_INT까지 올라갈 필요가 없습니까? – user4257726

관련 문제