2014-01-21 2 views
0

네트워크에서 주어진 포트 번호 (8000)를 검색하려면 어떻게해야합니까?
일반 소켓 TCP 연결을 사용해 보았습니다. 살아있는 IP의 수가 15보다 많으면 시간이 많이 걸립니다. 목표는 주어진 포트가 열려있는 네트워크에서 IP 목록을 얻는 것입니다.
이 내가 내 네트워크네트워크에서 열린 포트를 가장 빨리 검색하는 방법

std::vector<std::string> resultIPList; 
    FILE* pipe = popen("arp-scan --localnet","r"); 
    if(!pipe) 
    { 
     fprintf(stderr,"Unable to open pipe"); 
     return resultIPList; 
    } 
    char buffer[128]; 
    while(!feof(pipe)) 
    { 
     if(fgets(buffer, 128, pipe) != NULL) 
     { 
      stringBuffer += buffer; 
     } 
    } 
    pclose(pipe); 

이제 내 StringBuffer를이 IP 목록을 가지고에서 IP의 목록을 가져 오는 방법이다. i 문자열에서 ip를 추출하여 ip의 벡터를 제공하는 구문 분석기를 작성했습니다. 지금은 리눅스에 내가 같은 사용하여 부스트 : 당신은 잘못된 프로그램을 사용하고

struct sockaddr_in client; 
    int sock; 
    client.sin_family  = AF_INET; 
    client.sin_port  = htons(portNo); 
    client.sin_addr.s_addr = inet_addr(Ip.c_str()); 
    sock = (int) socket(AF_INET, SOCK_STREAM, 0); 
    return (::connect(sock, (struct sockaddr *) &client,sizeof(client)) == 0); 
+0

속도 저하가 발생하는 위치를 보여주는 코드를 게시 할 수 있습니까? – GMasucci

+0

'SOCK_STREAM'은 멀티 캐스트를 지원하지 않으므로 (알려진 바에 따르면) 알려진 IP 주소를 하나씩 시도하는 것을 제외하면 가장 빠른 방법으로 기대되는 것은 무엇입니까? 할 수있는 일은 거의 없지만 제대로 작동하는지 확인하고 연결해보십시오. – Damon

+0

그런 종류의 일을 빠르게하는 일반적인 방법은 많은 수의 스레드를 생성하고 각각을 시도하고 연결하는 것입니다. 불행하게도 TCP 재시도 메커니즘을 사용하면 각 개별 시도의 속도를 높이는 좋은 방법이 없기 때문에 병렬로 무리를 실행합니다. –

답변

0

ASIO를하고있는 중이 야, 아래 port.The 기능 창을위한 하나별로 하나의 각을 검색합니다. netstat의 출력을 읽으십시오.

+0

그런 netstat을 사용할 수 없습니다. –

+1

@RafaelBaptista 당신은 netstat을 사용할 수 있습니다. 나는 정확히 그 일을 몇 년 동안 생산해온 시스템을 물려 받았습니다. 분명히 인수와 구문 분석을 변경해야합니다. 또한 두 번째 단계없이 직접 포트를 제공합니다. – EJP

0

nmap을 사용하십시오.

또는 루프에서 비 차단 소켓을 사용하여 각 포트에 "연결"을 호출하십시오. 수집 한 모든 파일 설명자를 저장하고 "select()"를 사용하여 연결했는지 확인하십시오.

관련 문제