2016-11-29 9 views
0

이 예제를 실행하면 포트가 결코 netstat에 의해 나열되지 않는 것을 알 수 있습니다. 왜? 그리고 내가 어떻게 그렇게 할 수 있니?내 소켓의 열린 포트가 netstat에 나열되지 않는 이유는 무엇입니까?

#include <WinSock.h> 
#include <io.h> 
#include <stdio.h> 

#pragma comment(lib, "WS2_32") 

int main() { 
    WORD wVers = MAKEWORD(2, 2); 
    WSADATA wsa; 
    WSAStartup(wVers, &wsa); 
    SOCKET sock = socket(AF_INET, SOCK_STREAM, 6); 
    if (sock != INVALID_SOCKET) { 
     struct sockaddr_in addr = { 0 }; 
     addr.sin_family = AF_INET; 
     addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); 
     int addrlen = sizeof(addr); 
     bind(sock, (struct sockaddr *)&addr, addrlen); 
     if (getsockname(sock, (struct sockaddr *)&addr, &addrlen) == 0) { 
      fprintf(stdout, "HANDLE = %d, port = %d\n", sock, addr.sin_port); 
      fflush(stdout); 
      system("netstat -a -n"); 
     } 
     closesocket(sock); 
    } 
    WSACleanup(); 
} 
+2

bind()가 성공했는지 확인 했습니까? bind() 후에도 listen()을 호출하면 어떨까요? – nos

+0

@nos : 성공합니다. 그렇지 않으면 getsockname에 반환 할 포트가 없습니다. 하지만 왜 듣기가 필요한지 잘 모르겠습니다. 그 항구는 이미 나 한테 할당되어 있잖아. 그렇지? – Mehrdad

+0

'bind'는 적어도 Linux에서는 포트를 그 자리에두고 [reserve] (http://pastebin.com/LQavGgUf)합니다. – ikegami

답변

5

netstat -a에는 연결된 소켓과 청취 소켓 만 나열됩니다.

-a   Displays all connections and listening ports. 

어느 connectlisten은 당신의 소켓에서 호출, 그래서 netstat -a의 범위를 벗어나 있었다.

그러나 Windows 10부터 netstat -q을 사용할 수 있습니다.

-q   Displays all connections, listening ports, and bound 
+0

글쎄 지금 바보 같아 :) +1 감사합니다 – Mehrdad

+1

사실 - 최소한 윈도우 10 netstat이 깃발을 가지고''-q 모든 연결, 듣기 포트 및 바운드를 표시합니다 "이것은"BOUND "라는 단어로 불완전한 소켓을 보여줍니다. 상태 열 – nos

+0

@nos, 감사. 내 대답에 추가되었습니다. – ikegami