2016-07-20 15 views
1

自分自身のtraplistenerを使ってsnmpトラップを取得したい。実際には、私はいくつかの変更を追加したインターネットで見つかったコードを使用し、今は動作しています。私はポート162で聴くことができます。ポート162(Snmp Trap)にリスニングの結果をデコードする方法は?

#include "stdio.h" 
#include "winsock2.h" 
#pragma comment(lib, "ws2_32.lib") 
#define SNMP_TRAP_PORT 162 
#define MAX_MSG 400 

static void init(void) 
{ 

    WSADATA wsa; 
    int err = WSAStartup(MAKEWORD(2, 2), &wsa); 
    if(err < 0) 
    { 
     puts("WSAStartup failed !"); 
     exit(EXIT_FAILURE); 
    } 

} 

static void end(void) 
{ 

    WSACleanup(); 

} 

int main(int argc, char *argv[]) { 


    int sd, rc, n, cliLen; 
    struct sockaddr_in cliAddr, servAddr; 
    char msg[MAX_MSG]; 



    /* socket creation */ 
    init(); 
    sd= socket(AF_INET, SOCK_DGRAM, 0); 
    if(sd<0) { 
    printf("can't open socket \n"); 
    exit(1); 
    } 

    /* bind local server port */ 
    servAddr.sin_family = AF_INET; 
    servAddr.sin_addr.s_addr = htonl(INADDR_ANY); 
    servAddr.sin_port = htons(SNMP_TRAP_PORT); 
    rc = bind (sd, (struct sockaddr *) &servAddr,sizeof(servAddr)); 
    if(rc<0) { 
    printf("can't bind port number %d \n", SNMP_TRAP_PORT); 
    exit(1); 
    } 

    printf("waiting for SNMP Traps on UDP port %d\n", SNMP_TRAP_PORT); 

    /* server infinite loop */ 
    while(1) { 

    /* init buffer */ 
    memset(msg,0x0,MAX_MSG); 


    /* receive message */ 
    cliLen = sizeof(cliAddr); 
    n = recvfrom(sd, msg, MAX_MSG, 0, (struct sockaddr *) &cliAddr, &cliLen); 

    if(n<0) { 
     printf("%s: cannot receive data \n",argv[0]); 
     continue; 
    } 
    /*message is encoded with ASN1 and should be decoded*/ 
    /* print received message */ 
    printf("SNMP Trap received from %s : %o\n", inet_ntoa(cliAddr.sin_addr),msg); 


    }/* end of server infinite loop */ 
end(); 
return 0; 

} 

トラップを取得したときにコードが正常に機能します。通常、私はASN1(16進数またはビン)のトラップを取得する必要がありますが、私はちょうどこれを得る:Traplistner result。 私は12175440が何を意味するのだろうと思っていました。 Thx

答えて

1

短答; 8進数で書かれたメモリアドレスはmsgです。

このコードを32ビットのintと64ビットのポインタを持つリトルエンディアンマシンで実行している場合は、おそらくアドレスの下位32ビットがmsgです。

これは、2つの薄くなりの組合せである:

  1. printf形式指定子%oは整数として、引数データの次のバイトを解釈し、8進数でそれを印刷します。

  2. 関数の引数として配列を渡すと、最初の要素へのポインタが渡されます。したがって、これらのステートメントは等価です。

    printf("%p\n", msg); 
    printf("%p\n", &msg[0]); 
    

が実際にあなたが受信したデータを印刷するには、次の行を追加します。

for (int i = 0; i < n; ++i) { 
    printf("%02x ", (unsigned char)msg[i]); 
} 
printf("\n"); 
+0

こんにちは、私はあなたに感謝したいです。それは働いている。今私が得するのは数字のベンチです。私はASN.1メッセージを受け取っていると思います。私はスクリプトでメッセージをデコードする必要があると思う。 – Tarik

関連する問題