2009-07-23 7 views
1

Enumeration, vorausgesetzt, Sie haben keinen Zugriff auf die SOCKET-Handler.Wie aufgezählt UDP/TCP-Sockets unter Windows in C

+1

Warum ist diese Annahme notwendig? – mas

+0

Es ist nicht wirklich notwendig, aber das Feld war obligatorisch und ich konnte mir nichts besseres vorstellen, um es zu füllen :) –

Antwort

1

Verwenden Sie entweder GetUdpTable oder GetTcpTable-Funktionen.

Beispielcode für GetTcpTable unten (von http://msdn.microsoft.com/en-us/library/aa366026%28VS.85%29.aspx)

// Need to link with Iphlpapi.lib and Ws2_32.lib 
#include <winsock2.h> 
#include <ws2tcpip.h> 
#include <iphlpapi.h> 
#include <stdio.h> 

#pragma comment(lib, "iphlpapi.lib") 
#pragma comment(lib, "ws2_32.lib") 

#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x)) 
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x)) 

/* Note: could also use malloc() and free() */ 

int main() 
{ 

    // Declare and initialize variables 
    PMIB_TCPTABLE pTcpTable; 
    DWORD dwSize = 0; 
    DWORD dwRetVal = 0; 

    char szLocalAddr[128]; 
    char szRemoteAddr[128]; 

    struct in_addr IpAddr; 

    int i; 

    pTcpTable = (MIB_TCPTABLE *) MALLOC(sizeof (MIB_TCPTABLE)); 
    if (pTcpTable == NULL) { 
     printf("Error allocating memory\n"); 
     return 1; 
    } 

    dwSize = sizeof (MIB_TCPTABLE); 
// Make an initial call to GetTcpTable to 
// get the necessary size into the dwSize variable 
    if ((dwRetVal = GetTcpTable(pTcpTable, &dwSize, TRUE)) == 
     ERROR_INSUFFICIENT_BUFFER) { 
     FREE(pTcpTable); 
     pTcpTable = (MIB_TCPTABLE *) MALLOC(dwSize); 
     if (pTcpTable == NULL) { 
      printf("Error allocating memory\n"); 
      return 1; 
     } 
    } 
// Make a second call to GetTcpTable to get 
// the actual data we require 
    if ((dwRetVal = GetTcpTable(pTcpTable, &dwSize, TRUE)) == NO_ERROR) { 
     printf("\tNumber of entries: %d\n", (int) pTcpTable->dwNumEntries); 
     for (i = 0; i < (int) pTcpTable->dwNumEntries; i++) { 
      IpAddr.S_un.S_addr = (u_long) pTcpTable->table[i].dwLocalAddr; 
      strcpy_s(szLocalAddr, sizeof (szLocalAddr), inet_ntoa(IpAddr)); 
      IpAddr.S_un.S_addr = (u_long) pTcpTable->table[i].dwRemoteAddr; 
      strcpy_s(szRemoteAddr, sizeof (szRemoteAddr), inet_ntoa(IpAddr)); 

      printf("\n\tTCP[%d] State: %ld - ", i, 
        pTcpTable->table[i].dwState); 
      switch (pTcpTable->table[i].dwState) { 
      case MIB_TCP_STATE_CLOSED: 
       printf("CLOSED\n"); 
       break; 
      case MIB_TCP_STATE_LISTEN: 
       printf("LISTEN\n"); 
       break; 
      case MIB_TCP_STATE_SYN_SENT: 
       printf("SYN-SENT\n"); 
       break; 
      case MIB_TCP_STATE_SYN_RCVD: 
       printf("SYN-RECEIVED\n"); 
       break; 
      case MIB_TCP_STATE_ESTAB: 
       printf("ESTABLISHED\n"); 
       break; 
      case MIB_TCP_STATE_FIN_WAIT1: 
       printf("FIN-WAIT-1\n"); 
       break; 
      case MIB_TCP_STATE_FIN_WAIT2: 
       printf("FIN-WAIT-2 \n"); 
       break; 
      case MIB_TCP_STATE_CLOSE_WAIT: 
       printf("CLOSE-WAIT\n"); 
       break; 
      case MIB_TCP_STATE_CLOSING: 
       printf("CLOSING\n"); 
       break; 
      case MIB_TCP_STATE_LAST_ACK: 
       printf("LAST-ACK\n"); 
       break; 
      case MIB_TCP_STATE_TIME_WAIT: 
       printf("TIME-WAIT\n"); 
       break; 
      case MIB_TCP_STATE_DELETE_TCB: 
       printf("DELETE-TCB\n"); 
       break; 
      default: 
       printf("UNKNOWN dwState value\n"); 
       break; 
      } 
      printf("\tTCP[%d] Local Addr: %s\n", i, szLocalAddr); 
      printf("\tTCP[%d] Local Port: %d \n", i, 
        ntohs((u_short)pTcpTable->table[i].dwLocalPort)); 
      printf("\tTCP[%d] Remote Addr: %s\n", i, szRemoteAddr); 
      printf("\tTCP[%d] Remote Port: %d\n", i, 
        ntohs((u_short)pTcpTable->table[i].dwRemotePort)); 
     } 
    } else { 
     printf("\tGetTcpTable failed with %d\n", dwRetVal); 
     FREE(pTcpTable); 
     return 1; 
    } 

    return 0;  
} 
Verwandte Themen