2016-11-29 4 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

実際には、少なくともWindows 10ではnetstatにこのフラグがあります。 "-qすべての接続、リスニングポート、およびバウンドを表示します"これは、 "BOUND"という単語を含むこれらの不完全なソケットを州の列 – nos

+0

@nos、ありがとう。私の答えに追加されました。 – ikegami

関連する問題